两种语言实现设计模式(C++和Java)(十六:状态模式)
Posted asp1rant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两种语言实现设计模式(C++和Java)(十六:状态模式)相关的知识,希望对你有一定的参考价值。
状态模式对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
状态模式是一种对象行为型模式,其主要优点如下。
- 状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。
- 减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。
- 有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。
状态模式的主要缺点如下。
- 状态模式的使用必然会增加系统的类与对象的个数。
- 状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
UML:
示例:
以仓库里的无人仓储物流机器人(AGV)为例,设计AGV的工作模式时,为AGV定义3种状态:空闲状态(接收任务),工作状态(接收新任务后放入任务队列等待执行),故障状态(不接收任何任务),代码实现如下:
1 #include <iostream> 2 3 using namespace std; 4 5 //命令类,传递到状态中执行 6 class Order 7 private: 8 bool accepted; 9 public: 10 string orderId; 11 Order(string _id) 12 orderId = _id; 13 accepted = false; 14 15 void accept() 16 accepted = true; 17 18 ; 19 20 //状态抽象类 21 class State 22 protected: 23 string name; 24 public: 25 State(string _name) 26 name = _name; 27 28 virtual void handleNewOrder(Order *order) = 0; 29 string getName() 30 return name; 31 32 ; 33 34 //具体状态类 35 class StateRunning:public State 36 public: 37 using State::State; 38 virtual void handleNewOrder(Order* order) 39 cout << name << "忙碌中,将任务添加到任务序列" << order->orderId << endl; 40 order->accept(); 41 42 ; 43 44 class StateWaiting:public State 45 public: 46 using State::State; 47 virtual void handleNewOrder(Order* order) 48 cout << name <<"立即执行任务" << order->orderId << endl; 49 order->accept(); 50 51 ; 52 53 class StateFault:public State 54 public: 55 using State::State; 56 virtual void handleNewOrder(Order* order) 57 cout << name <<"故障,不接收任务" << endl; 58 59 ; 60 61 //环境类,AGV 62 class Agv 63 private: 64 State *state; 65 public: 66 void receiveNewOrder(Order* order) 67 state->handleNewOrder(order); 68 69 70 void setState(State* state) 71 this->state = state; 72 73 74 string getState() 75 return state->getName(); 76 77 ; 78 79 int main() 80 81 Agv agv; 82 State *pStateRunning = new StateRunning("running"); 83 State *pStateWaiting = new StateWaiting("waiting"); 84 State *pStateFault = new StateFault("fault"); 85 agv.setState(pStateRunning); 86 agv.receiveNewOrder(new Order("1")); 87 agv.setState(pStateWaiting); 88 agv.receiveNewOrder(new Order("2")); 89 agv.setState(pStateFault); 90 agv.receiveNewOrder(new Order("3")); 91 return 0; 92
Java实现如下:
1 public class Order 2 3 private String name; 4 5 private boolean accepted; 6 7 public Order(String name) 8 this.name = name; 9 accepted = false; 10 11 12 public void accept() 13 this.accepted = true; 14 15 16 public String getName() 17 return this.name; 18 19 20 21 public abstract class State 22 23 protected String name; 24 25 public State(String name) 26 this.name = name; 27 28 29 public String getName() 30 return name; 31 32 33 public void handleNewOrder(Order order) 34 35 36 public class StateRunning extends State 37 38 public StateRunning(String name) 39 super(name); 40 41 42 @Override 43 public void handleNewOrder(Order order) 44 System.out.println(name + "忙碌中,将任务添加到任务序列" + order.getName()); 45 order.accept(); 46 47 48 49 public class StateWaiting extends State 50 51 public StateWaiting(String name) 52 super(name); 53 54 55 @Override 56 public void handleNewOrder(Order order) 57 System.out.println(name + "立即执行任务" + order.getName()); 58 order.accept(); 59 60 61 62 public class StateFault extends State 63 64 public StateFault(String name) 65 super(name); 66 67 68 @Override 69 public void handleNewOrder(Order order) 70 System.out.println(name + "故障,不接收任务"); 71 72 73 74 public class Agv 75 76 private State state; 77 78 public String getState() 79 return state.getName(); 80 81 82 public void setState(State state) 83 this.state = state; 84 85 86 public void receiveNewOrder(Order order) 87 state.handleNewOrder(order); 88 89 90 91 public class Main 92 public static void main(String[] args) 93 Agv agv = new Agv(); 94 State stateRunning = new StateRunning("running"); 95 State stateWaiting = new StateWaiting("waiting"); 96 State stateFault = new StateFault("fault"); 97 agv.setState(stateRunning); 98 agv.receiveNewOrder(new Order("1")); 99 agv.setState(stateWaiting); 100 agv.receiveNewOrder(new Order("2")); 101 agv.setState(stateFault); 102 agv.receiveNewOrder(new Order("3")); 103 104
输出:
running忙碌中,将任务添加到任务序列1 waiting立即执行任务2 fault故障,不接收任务
以上是关于两种语言实现设计模式(C++和Java)(十六:状态模式)的主要内容,如果未能解决你的问题,请参考以下文章
两种语言实现设计模式(C++和Java)(十四:责任链模式)
java byte数到十六进制字符串表现形式程序设计原理和实现方式
冯志霞201771010107《面向对象程序设计(java)》第十六周学习总结