两种语言实现设计模式(C++和Java)(十六:状态模式)
时间:2019-08-10
本文章向大家介绍两种语言实现设计模式(C++和Java)(十六:状态模式),主要包括两种语言实现设计模式(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故障,不接收任务
原文地址:https://www.cnblogs.com/Asp1rant/p/11332748.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 七、this
- 七日Python之路--第四天(之多线程)
- 超性感的React Hooks(八)useContext
- 七日Python之路--第三天(之不安分 wxPython)
- 七日Python之路--第三天
- 超性感的React Hooks(九)useContext实践
- 七日Python之路--第三天(之初试Django 2-2)
- 超性感的React Hooks(十)useRef
- 七日Python之路--第三天(之初试Django 2-1)
- 超性感的React Hooks(十一)useCallback、useMemo
- 七日Python之路--第二天
- 八、通过断点调试观察JS执行过程
- 传智播客OA项目学习--阶段三(Struts中Action书写)
- 九、函数与函数式编程
- 关于Hibernate懒加载----Spring filter