设计模式--状态模式C++实现
1定义
当一个状态的内在状态改变时允许其行为改变,这个对象看起来像改变了其类
2类图

角色分析
State抽象状态角色,接口或者抽象类,负责状态定义,并且封装环境角色以实现状态切换
ConcreteState具体状态角色,完成两个职责:本状态行为管理以及趋向状态处理--==本状态要做的事和本状态如何过度到其他状态
Context环境角色,定义客户端需要的接口,并且负责具体状态的切换
实现
#include<iostream>
using namespace std; //前项声明
class Context;
//抽象状态类定义
class State
{
protected:
State(){}
public:
virtual~State() =
{};
void setContext(Context *x)
{
_context = x;
}
virtual void handler1() = ;
virtual void handler2() = ;
private:
Context *_context;
}; //具体状态定义
class ConcreteState1 :public State
{
public:
ConcreteState1(){}
~ConcreteState1(){} void handler1()
{
cout << "ConcreteState1::handler1" << endl;
}
void handler2()
{
cout << "ConcreteState1::handler2" << endl;
}
private: }; //具体状态定义
class ConcreteState2 :public State
{
public:
ConcreteState2(){}
~ConcreteState2(){} void handler1()
{
cout << "ConcreteState2::handler1" << endl;
}
void handler2()
{
cout << "ConcreteState2::handler2" << endl;
}
private: }; //环境类
class Context
{
public:
Context()
:Sta1(new ConcreteState1)
,Sta2(new ConcreteState2)
{}
State* getCurrentState()
{
return CurrentState;
}
void SetCurrentState(State* s)
{
CurrentState = s;
CurrentState->setContext(this);
}
void handler1()
{
CurrentState->handler1();
}
void handler2()
{
CurrentState->handler2();
}
~Context(){}
private:
//当前状态则是所有状态中的一种
State *CurrentState;
//所有状态应当定义为static比较合适
State *Sta1;
State *Sta2;
};
void TestState()
{
Context * context = new Context();
context->SetCurrentState(new ConcreteState1()); context->handler1();
context->handler2();
context->SetCurrentState(new ConcreteState2());
context->handler1();
context->handler2();
}
3应用
①优点
状态模式隐藏了状态的 变化过程,他的切换引起了行为的变化。我们只看到行为变化,而没有状态变化
结构清晰,避免过多switch或者if语句的使用
体现开闭原则和单一职责原则,每个状态都是一个子类
封装性良好,状态变化在内部体现,外界调用不知道这一点
②缺点
子类越多会带来类膨胀的问题
4使用场景
行为随着状态改变而改变
条件分之判断语句的替代者
5注意事项
状态模式适用于当某个对象在他的状态发生变化时,他的行为也随之变化,也就是行为受状态约束的情况下使用状态模式,而且使用对象时状态不超过5个
6最佳实践
TCP三个状态切换:等待状态,连接状态,断开状态。
工作流开发:状态机管理。
{
设计模式--状态模式C++实现的更多相关文章
- 14. 星际争霸之php设计模式--状态模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- [Head First设计模式]生活中学设计模式——状态模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 状态模式
用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构
- 深入浅出设计模式——状态模式(State Pattern)
模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的 ...
- C++设计模式——状态模式
前言 在实际开发中,我们经常会遇到这种情况:一个对象有多种状态,在每一个状态下,都会有不同的行为.那么在代码中我们经常是这样实现的. typedef enum tagState { state, st ...
- C#设计模式--状态模式
设计模式: 状态模式(State Pattern) 简单介绍: 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示 ...
- Java设计模式—状态模式
状态模式又是一个比较难的设计模式 定义如下: 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类. 个人理解:通俗的讲,状态模式就是状态的改变引起了行为的改变,但是,我们只能看到行为的 ...
- 设计模式-状态模式(State Pattern)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 状态模式简介 状态模式允许一个对象在其内部状态改变的时候改变它的行为,他的内部会存着好几种状态, ...
- JavaScript设计模式——状态模式
状态和行为: 所谓对象的状态,通常指的就是对象实例的属性的值:而行为指的就是对象的功能,再具体点说,行为大多可以对应到方法上. 状态模式的功能就是分离状态的行为,通过维护状态的变化,来调用不同状态对应 ...
- C#设计模式——状态模式(State Pattern)
一.概述在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构 ...
随机推荐
- java通过url抓取网页数据
在很多行业中,要对行业数据进行分类汇总,及时分析行业数据,对于公司未来的发展,有很好的参照和横向对比.所以,在实际工作,我们可能要遇到数据采集这个概念,数据采集的最终目的就是要获得数据,提取有用的数据 ...
- [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程
基于NVidia开源的nvidia/cuda image,构建适用于DeepLearning的基础image. 思路就是先把常用的东西都塞进去,再装某个框架就省事儿了. 为了体验重装系统的乐趣,所以采 ...
- Java设计原则—单一职责原则(转)
定义: 应该有且仅有一个原因引起类的变更. There should never be more than one reason for a class to change. 优点: 1.类的复杂性降 ...
- 48. Rotate Image(旋转矩阵)
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise) ...
- HackerRank - greedy-florist 【贪心】
HackerRank - greedy-florist [贪心] 题意 有N个人 要去买K朵花.老板为了最大化新顾客的数量.就压榨回头客.每一朵花都有一个基本价格.一个顾客买下这朵花的价格是他来这里买 ...
- CentOS 6.5上安装python2.7、pip以及Python命令行补全和yum冲突解决
目前CentOS6.5上自带的python版本为2.6,升级到python2.7会碰到很多问题.本文将介绍如何安装python2.7.pip以及python命令行补全. 一.如何安装python2.7 ...
- JAVA BIO与NIO、AIO的区别
IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...
- java获得两个日期之间的所有月份
private static List<String> getMonthBetween(String minDate, String maxDate) throws ParseExcept ...
- Unix/Linux操作系统中如何在sqlplus/rman中使用方向键
默认情况下在Unix/Linux中使用Oracle的sqlplus/rman是无法使用↑↓←→几个方向键进行操作的,要想达到Windows下使用sqlplus/rman的效果需要安装rlwrap. r ...
- [转]手把手教你搭建Hive Web环境
了解Hive的都知道Hive有三种使用方式——CLI命令行,HWI(hie web interface)浏览器 以及 Thrift客户端连接方式. 为了体验下HWI模式,特意查询了多方的资料,都没有一 ...