【聲明】本題目來源于卡碼網(wǎng)(卡碼網(wǎng)KamaCoder)
【提示:如果不想看文字介紹,可以直接跳轉到C++編碼部分】
【設計模式大綱】
【簡介】
? ? ? ? --什么是狀態(tài)模式(第20種設計模式)
????????狀態(tài)模式(State Pattern)是?種行為型設計模式,它適?于?個對象在不同的狀態(tài)下有不同的行為時,?如說電燈的開、關、閃爍是不停的狀態(tài),狀態(tài)不同時,對應的行為也不同,在沒有狀態(tài)模式的情況下,為了添加新的狀態(tài)或修改現(xiàn)有的狀態(tài),往往需要修改已有的代碼,這違背了開閉原則,而且如果對象的狀態(tài)切換邏輯和各個狀態(tài)的行為都在同?個類中實現(xiàn),就可能導致該類的職責過重,不符合單?職責原則。
????????而狀態(tài)模式將每個狀態(tài)的行為封裝在?個具體狀態(tài)類中,使得每個狀態(tài)類相對獨?,并將對象在不同狀態(tài)下的行為進?委托,從而使得對象的狀態(tài)可以在運行時動態(tài)改變,每個狀態(tài)的實現(xiàn)也不會影響其他狀態(tài)。
【基本結構】
????????狀態(tài)模式包括以下?個重要角色:
- State (狀態(tài)): 定義?個接口,?于封裝與Context的?個特定狀態(tài)相關的?為。
- ConcreteState (具體狀態(tài)): 負責處理Context在狀態(tài)改變時的?為, 每?個具體狀態(tài)?類實現(xiàn)?個與Context 的?個狀態(tài)相關的?為。
- Context (上下?): 維護?個具體狀態(tài)?類的實例,這個實例定義當前的狀態(tài)。
【基本實現(xiàn)】
1. 定義狀態(tài)接口:
????????創(chuàng)建?個狀態(tài)接?,該接?聲明了對象可能的各種狀態(tài)對應的?法。
// 狀態(tài)接?
public interface State {
void handle();
}
2. 實現(xiàn)具體狀態(tài)類:
????????為對象可能的每種狀態(tài)創(chuàng)建具體的狀態(tài)類,實現(xiàn)狀態(tài)接?中定義的?法。
// 具體狀態(tài)類1
public class ConcreteState1 implements State {
@Override
public void handle() {
// 執(zhí)?在狀態(tài)1下的操作
}
}
// 具體狀態(tài)類2
public class ConcreteState2 implements State {
@Override
public void handle() {
// 執(zhí)?在狀態(tài)2下的操作
}
}
3. 創(chuàng)建上下文類:
????????該類包含對狀態(tài)的引用,并在需要時調(diào)?當前狀態(tài)的?法。
// 上下?類
public class Context {
private State currentState;
public void setState(State state) {
this.currentState = state;
}
public void request() {
currentState.handle();
}
}
4. 客戶端使用:
????????創(chuàng)建具體的狀態(tài)對象和上下文對象,并通過上下文對象調(diào)用相應的?法。通過改變狀態(tài),可以改變上下?對象的行為
public class Client {
public static void main(String[] args) {
Context context = new Context();
State state1 = new ConcreteState1();
State state2 = new ConcreteState2();
context.setState(state1);
context.request(); // 執(zhí)?在狀態(tài)1下的操作
context.setState(state2);
context.request(); // 執(zhí)?在狀態(tài)2下的操作
}
}
【使用場景】
????????狀態(tài)模式將每個狀態(tài)的實現(xiàn)都封裝在?個類中,每個狀態(tài)類的實現(xiàn)相對獨?,使得添加新狀態(tài)或修改現(xiàn)有狀態(tài)變得更加容易,避免了使??量的條件語句來控制對象的行為。但是如果狀態(tài)過多,會導致類的數(shù)量增加,可能會使得代碼結構復雜。
????????總的來說,狀態(tài)模式適用于有限狀態(tài)機的場景,其中對象的?為在運?時可以根據(jù)內(nèi)部狀態(tài)的改變?改變,在游戲開發(fā)中,Unity3D 的 Animator 控制器就是?個狀態(tài)機。它允許開發(fā)?員定義不同的狀態(tài)(動畫狀態(tài)),并通過狀態(tài)轉換來實現(xiàn)角色的動畫控制和?為切換。
【C++編碼部分】
1. 題目描述
????????小明家有一個燈泡,剛開始為關閉狀態(tài)(OffState)。臺燈可以接收一系列的指令,包括打開("ON")、關閉("OFF")和閃爍("BLINK")。每次接收到一個指令后,臺燈會執(zhí)行相應的操作,并輸出當前燈泡的狀態(tài)。請設計一個程序模擬這個燈泡系統(tǒng)。
2. 輸入描述
????????第一行是一個整數(shù) n(1 <= n <= 1000),表示接收的命令數(shù)量。?接下來的 n 行,每行包含一個字符串 s,表示一個命令("ON"、"OFF"或"BLINK")。
3. 輸出描述
????????對于每個命令,輸出一行,表示執(zhí)行該命令后燈泡的狀態(tài)。
4. C++編程實例
/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file StateMode.hpp
* @brief 狀態(tài)模式
* @autor 寫代碼的小恐龍er
* @date 2024/01/24
*/
#include <iostream>
#include <string>
using namespace std;
// 前置聲明
// 狀態(tài)接口 類
class State;
// 具體狀態(tài)1 -- 打開
class StateOn;
// 具體狀態(tài)2 -- 關閉
class StateOff;
// 具體狀態(tài)3 -- 閃爍
class StateBlink;
// 上下文類 -- 關注的對象類 燈
class Light;
// 狀態(tài)接口 類
class State{
// 成員接口函數(shù)
public:
virtual string Handle() = 0;
};
// 具體狀態(tài)1 -- 打開
class StateOn : public State
{
// 重載接口函數(shù)
public:
string Handle() override{
return "Light is ON";
}
};
// 具體狀態(tài)2 -- 關閉
class StateOff : public State
{
// 重載接口函數(shù)
public:
string Handle() override{
return "Light is OFF";
}
};
// 具體狀態(tài)3 -- 閃爍
class StateBlink : public State
{
// 重載接口函數(shù)
public:
string Handle() override{
return "Light is Blinking";
}
};
// 上下文類 -- 關注的對象類 燈
class Light{
// 成員數(shù)據(jù)
private:
// 燈的狀態(tài)
State *_state = nullptr;
// 成員函數(shù)
public:
// 構造函數(shù)
Light(){
this->_state = new StateOff();
}
// 設置狀態(tài)
void SetState(State *state){
this->_state = state;
}
// 執(zhí)行操作
string HandleState(){
return _state->Handle();
}
};
int main()
{
// 命令數(shù)量
int orderNum = 0;
std::cin >> orderNum;
// 創(chuàng)建 上下文類 -- 燈泡
Light *light = new Light();
// 創(chuàng)建 狀態(tài)基類
State *state = nullptr;
// 遍歷輸入
for(int i = 0; i < orderNum; i++){
// 指令類型
string orderType = "";
std::cin >> orderType;
// 判斷
if(orderType == "ON"){
state = new StateOn();
}
else if(orderType == "OFF"){
state = new StateOff();
}
else if(orderType == "BLINK"){
state = new StateBlink();
}
// 給燈設置狀態(tài)
light->SetState(state);
// 打印信息
string printInfo = light->HandleState();
std::cout << printInfo << endl;
}
// 析構!
delete light;
light = nullptr;
if(state != nullptr){
delete state;
state = nullptr;
}
return 0;
}
......文章來源:http://www.zghlxwxcb.cn/news/detail-824880.html
To be continued.文章來源地址http://www.zghlxwxcb.cn/news/detail-824880.html
到了這里,關于C++設計模式之狀態(tài)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!