设计模式--状态模式C++实现
2016-04-09 00:00
417 查看
1定义
当一个状态的内在状态改变时允许其行为改变,这个对象看起来像改变了其类2类图
角色分析
State抽象状态角色,接口或者抽象类,负责状态定义,并且封装环境角色以实现状态切换
ConcreteState具体状态角色,完成两个职责:本状态行为管理以及趋向状态处理--==本状态要做的事和本状态如何过度到其他状态
Context环境角色,定义客户端需要的接口,并且负责具体状态的切换
实现
#include<iostream> usingnamespacestd; //前项声明 classContext; //抽象状态类定义 classState { protected: State(){} public: virtual~State()=0 {}; voidsetContext(Context*x) { _context=x; } virtualvoidhandler1()=0; virtualvoidhandler2()=0; private: Context*_context; }; //具体状态定义 classConcreteState1:publicState { public: ConcreteState1(){} ~ConcreteState1(){} voidhandler1() { cout<<"ConcreteState1::handler1"<<endl; } voidhandler2() { cout<<"ConcreteState1::handler2"<<endl; } private: }; //具体状态定义 classConcreteState2:publicState { public: ConcreteState2(){} ~ConcreteState2(){} voidhandler1() { cout<<"ConcreteState2::handler1"<<endl; } voidhandler2() { cout<<"ConcreteState2::handler2"<<endl; } private: }; //环境类 classContext { public: Context() :Sta1(newConcreteState1) ,Sta2(newConcreteState2) {} State*getCurrentState() { returnCurrentState; } voidSetCurrentState(State*s) { CurrentState=s; CurrentState->setContext(this); } voidhandler1() { CurrentState->handler1(); } voidhandler2() { CurrentState->handler2(); } ~Context(){} private: //当前状态则是所有状态中的一种 State*CurrentState; //所有状态应当定义为static比较合适 State*Sta1; State*Sta2; };
voidTestState() { Context*context=newContext(); context->SetCurrentState(newConcreteState1()); context->handler1(); context->handler2(); context->SetCurrentState(newConcreteState2()); context->handler1(); context->handler2(); }
3应用
①优点状态模式隐藏了状态的变化过程,他的切换引起了行为的变化。我们只看到行为变化,而没有状态变化
结构清晰,避免过多switch或者if语句的使用
体现开闭原则和单一职责原则,每个状态都是一个子类
封装性良好,状态变化在内部体现,外界调用不知道这一点
②缺点
子类越多会带来类膨胀的问题
4使用场景
行为随着状态改变而改变条件分之判断语句的替代者
5注意事项
状态模式适用于当某个对象在他的状态发生变化时,他的行为也随之变化,也就是行为受状态约束的情况下使用状态模式,而且使用对象时状态不超过5个6最佳实践
TCP三个状态切换:等待状态,连接状态,断开状态。工作流开发:状态机管理。
{
相关文章推荐
- C++实验3-税收计算
- c++第三次上机-1
- C++Primer习题9.26,9.27解答错误
- leetcode(一)—— Two Sum(Python/C++)
- c++第三次上机-2
- C++ STL 迭代器失效问题
- C语言从文件中读入矩阵,并且将矩阵转置
- C++实现 一个数组实现两个栈
- C++11中的bind与lambda比较
- 算法复习-二叉搜索树BST的c++实现
- c++作业3
- C++实现——三子棋游戏
- C/C++ 图像二进制存储与读取
- 2016第七届蓝桥杯C/C++ B组省赛题解 H题
- c++ set 常用用法介绍
- C/C++二进制读写png文件
- C++引用详解
- 1017
- 2017京东实习生笔试题(二)
- 1019