状态模式
1.状态模式:改变对象内部的状态控制,当动作被调用,被委托到当前的状态; ------ 状态在游走,客户不了解
策略模式:产生可以互换的算法控制;使用组合引用不同的状态来造成改变的假象; ------ 定制组合,客户定义
2.代码
C++
1 //state c++ 2 #include <iostream> 3 using namespace std; 4 5 class State{ 6 public: 7 virtual void next() = 0; 8 }; 9 10 class Alaskan{ 11 public: 12 Alaskan(){} 13 void setState(State * p){ 14 m_pState = p; 15 } 16 void nextState(){ 17 m_pState->next(); 18 } 19 public: 20 State * eatState; 21 State * sleepState; 22 State * playState; 23 private: 24 State * m_pState; 25 }; 26 27 class EatState : public State{ 28 public: 29 EatState(Alaskan *p) : m_p(p){} 30 void next(){ 31 cout<<"sleeping..."<<endl; 32 m_p->setState(m_p->sleepState); 33 } 34 private: 35 Alaskan *m_p; 36 }; 37 38 class SleepState : public State{ 39 public: 40 SleepState(Alaskan *p) : m_p(p){} 41 void next(){ 42 cout<<"play..."<<endl; 43 m_p->setState(m_p->playState); 44 } 45 private: 46 Alaskan *m_p; 47 }; 48 49 class PlayState : public State{ 50 public: 51 PlayState(Alaskan *p) : m_p(p){} 52 void next(){ 53 cout<<"eating..."<<endl; 54 m_p->setState(m_p->eatState); 55 } 56 private: 57 Alaskan *m_p; 58 }; 59 60 int main(){ 61 Alaskan * alaskanDog = new Alaskan(); 62 alaskanDog->eatState = new EatState(alaskanDog); 63 alaskanDog->sleepState = new SleepState(alaskanDog); 64 alaskanDog->playState = new PlayState(alaskanDog); 65 66 cout<<"Alaskan is sleeping... "<<endl; 67 alaskanDog->setState(alaskanDog->sleepState); 68 69 cout<<"1.Alaskan Next: "; 70 alaskanDog->nextState(); 71 72 cout<<"2.Alaskan Next: "; 73 alaskanDog->nextState(); 74 75 cout<<"3.Alaskan Next: "; 76 alaskanDog->nextState(); 77 78 return 0; 79 }
Java:
1 //state java 2 class GumballMachine{ 3 State soldOutState; 4 State noQuarterState; 5 State hasQuarterState; 6 State soldState; 7 8 State state = soldOutState; 9 int count = 0; 10 public GumballMachine(int numberGumballs){ 11 soldOutState = new SoldOutState(this); 12 noQuarterState = new NoQuarterState(this); 13 hasQuarterState = new HasQuarterState(this); 14 soldState = new SoldState(this); 15 16 this.count = numberGumballs; 17 if(numberGumballs > 0){ 18 state = noQuarterState; 19 }else{ 20 state = soldOutState; 21 } 22 } 23 24 public void insertQuarter(){ 25 state.insertQuarter(); 26 } 27 public void ejectQuarter(){ 28 state.ejectQuarter(); 29 } 30 public void turnCrank(){ 31 state.turnCrank(); 32 state.dispense(); 33 } 34 void releaseBall(){ 35 System.out.println("A gumball comes rolling out of the slot"); 36 if(count != 0){ 37 count = count -1; 38 } 39 } 40 //change state 41 void setState(State state){ 42 this.state = state; 43 } 44 public State getState(){ 45 return this.state; 46 } 47 public State getSoldOutState(){ 48 return soldOutState; 49 } 50 public State getNoQuarterState(){ 51 return noQuarterState; 52 } 53 public State getHasQuarterStete(){ 54 return hasQuarterState; 55 } 56 public State getSoldState(){ 57 return soldState; 58 } 59 public int getCount(){ 60 return count; 61 } 62 void refill(int count){ 63 this.count += count; 64 System.out.println("Refill: " + count); 65 state.refill(); 66 } 67 public String toString(){ 68 StringBuffer result = new StringBuffer(); 69 result.append("\nInventory number: " + count + "\n"); 70 result.append("state: " + state + "\n"); 71 return result.toString(); 72 } 73 } 74 75 //State 76 interface State{ 77 public void insertQuarter(); 78 public void ejectQuarter(); 79 public void turnCrank(); 80 public void dispense(); 81 public void refill(); 82 } 83 84 class SoldOutState implements State{ 85 GumballMachine gumballMachine; 86 public SoldOutState(GumballMachine gumballMachine){ 87 this.gumballMachine = gumballMachine; 88 } 89 public void insertQuarter(){ 90 System.out.println("can`n do it no gumball"); 91 } 92 public void ejectQuarter(){ 93 System.out.println("can`n do it no gumball"); 94 } 95 public void turnCrank(){ 96 System.out.println("can`n do it no gumball"); 97 } 98 public void dispense(){ 99 System.out.println("can`n do it no gumball"); 100 } 101 public String toString(){ 102 return "sold out"; 103 } 104 public void refill(){ 105 gumballMachine.setState(gumballMachine.getNoQuarterState()); 106 } 107 } 108 109 class NoQuarterState implements State{ 110 GumballMachine gumballMachine; 111 public NoQuarterState(GumballMachine gumballMachine){ 112 this.gumballMachine = gumballMachine; 113 } 114 public void insertQuarter(){ 115 System.out.println("You inserted a quarter"); 116 gumballMachine.setState(gumballMachine.getHasQuarterStete()); 117 } 118 public void ejectQuarter(){ 119 System.out.println("You haven`t nserted a quarter"); 120 } 121 public void turnCrank(){ 122 System.out.println("there is no quarter"); 123 } 124 public void dispense(){ 125 System.out.println("You need to pay first"); 126 } 127 public String toString(){ 128 return "waiting for quarter"; 129 } 130 public void refill(){} 131 } 132 133 class HasQuarterState implements State{ 134 GumballMachine gumballMachine; 135 public HasQuarterState(GumballMachine gumballMachine){ 136 this.gumballMachine = gumballMachine; 137 } 138 public void insertQuarter(){ 139 System.out.println("You can`t insert another quarter"); 140 } 141 public void ejectQuarter(){ 142 System.out.println("Quarter returned"); 143 gumballMachine.setState(gumballMachine.getNoQuarterState()); 144 } 145 public void turnCrank(){ 146 System.out.println("your turn..."); 147 gumballMachine.setState(gumballMachine.getSoldState()); 148 } 149 public void dispense(){ 150 System.out.println("No gumball dispense"); 151 } 152 public String toString(){ 153 return "waiting for turn of crank"; 154 } 155 public void refill(){} 156 } 157 158 class SoldState implements State{ 159 GumballMachine gumballMachine; 160 public SoldState(GumballMachine gumballMachine){ 161 this.gumballMachine = gumballMachine; 162 } 163 public void insertQuarter(){ 164 System.out.println("can`n do it"); 165 } 166 public void ejectQuarter(){ 167 System.out.println("can`n do it"); 168 } 169 public void turnCrank(){ 170 System.out.println("can`n do it"); 171 } 172 public void dispense(){ 173 gumballMachine.releaseBall(); 174 if(gumballMachine.getCount()>0) 175 gumballMachine.setState(gumballMachine.getNoQuarterState()); 176 else 177 gumballMachine.setState(gumballMachine.getSoldOutState()); 178 } 179 public String toString(){ 180 return "sold State"; 181 } 182 public void refill(){} 183 } 184 185 class gumballMachineTest{ 186 public static void main(String[] args){ 187 GumballMachine machine = new GumballMachine(2); 188 System.out.println(machine); 189 190 System.out.println("1>"); 191 machine.insertQuarter(); 192 machine.turnCrank(); 193 194 System.out.println("\n2>"); 195 machine.insertQuarter(); 196 machine.turnCrank(); 197 198 System.out.println("\n3>"); 199 machine.insertQuarter(); 200 201 System.out.println("\nRefill>"); 202 machine.refill(3); 203 204 System.out.println("\n4>"); 205 machine.insertQuarter(); 206 machine.turnCrank(); 207 } 208 }
3.其他:
Alaskan 在 State 前实现,函数Alaskan::nextState()的实现要放到State后面,在Alaskan类中仅声明该函数,可编过;
前置声明class State;后可以定义该类型指针,但实例化还不可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通