设计模式—状态模式(十二)
来源:互联网 发布:个人数据融合模型 编辑:程序博客网 时间:2024/06/05 20:45
软件领域中的设计模式的重要性不言而喻。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态。虽然知道这些特性的定义但是并没有做到真正的理解,这样特性有什么作用?用于什么场合中等等问题,带着疑问开始学习设计模式,主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。
状态模式(State):当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,可考虑用到状态模式。
状态模式的优点与用处:
将与特定状态相关的行为局部化,并且将不同的状态行为分割开来;就是将特定状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和转换。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少耦合性;
什么时候考虑使用设计模式:当一个对象取决于它的状态,并且它必须在运行时刻根据状态改变他的行为时,他就可以考虑使用状态模式了。
#include <iostream>using namespace std;class Work;class State{public:virtual void WriteProgram(Work* w) = 0;};class Work{private:State* current;public:double hour;public:Work();void SetState(State* temp){current = temp;}void Writeprogram(){current->WriteProgram(this);}};class EvenState :public State{public:virtual void WriteProgram(Work* w){if ((w->hour) < 18)cout << "马上快下班了" << endl;elsecout << "是时候回家了" << endl;}};class NoonState : public State{public:virtual void WriteProgram(Work* w){if ((w->hour) < 14)cout << "目前还不困,在干一会" << endl;else{w->SetState(new EvenState());//重新设置状态w->Writeprogram();//重新调用Writeprogram()}}};class ForenoonState : public State{public:virtual void WriteProgram(Work* w){if ((w->hour)<12)cout << "上午的精神很好" << endl;else{w->SetState(new NoonState()); // 重新设置状态w->Writeprogram(); //重新调用Writeprogram()}}};Work::Work(){current = new ForenoonState();}//客户端:int main(){Work* mywork = new Work();mywork->hour = 9;mywork->Writeprogram();mywork->hour = 13;mywork->Writeprogram();mywork->hour = 15;mywork->Writeprogram();mywork->hour = 19;mywork->Writeprogram();return 0;}
阅读全文
0 0
- 设计模式—状态模式(十二)
- 设计模式(十二)——状态模式
- 设计模式(十二)状态模式
- 大话设计模式学习(十二)——状态模式
- (十二)状态模式
- 十二、状态模式——设计模式学习笔记
- 设计模式学习笔记二十二(State状态模式)
- 设计模式之(十二、状态模式State)
- 设计模式实现(十二)--- 状态模式(State)
- (二十二)Java设计模式之状态模式
- JAVA设计模式十二--State(状态模式)
- JAVA设计模式十二:--State(状态模式)
- 设计模式C++实现十二:状态模式
- 设计模式之十二:状态模式(State)
- 设计模式系列之十二状态模式
- Java设计模式《十二》状态模式
- [设计模式](十二):备忘录模式(Memento)|状态模式(State)
- 设计模式学习笔记(二十二)——State状态
- Hibernate事务的开启问题
- 初级程序猿的代码练习经历
- (个人)AR电子书创新系统实训第五周(2)
- centos7 配置 lnmp
- 表单用serialize()序列化并且通过ajax向后台传值,后台方法参数传递问题
- 设计模式—状态模式(十二)
- 设计模式--------工厂模式
- Java开发中各种流程控制讲解
- 如何:更改功能区上选项卡的位置,内置选项卡的前面或后面
- Jackson异常情况处理
- 两数组的交
- js栈内存和堆内存的区别
- 算法导论--线性时间排序
- spring jack 使用自定义的objectMapper。或者在xml配置objectMapper参数