“状态变化”模式

  在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。
  典型模式
  # state
  # memento

  Part 1 State 状态模式
  动机
  #在软件构建过程中,某些对象的状态如果改变,其行为也会随之而变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。
  #如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?
  #避免代码的坏味道——Long Method
  模式定义
  允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。——《设计模式》GoF
  结构
 

  结构 from 《大话设计模式》

  代码 未使用State模式 from 《大话设计模式》

 void work(int clock, TASK_FINISH task) {
if (clock < )
{
cout << "上午"<<endl;
}
else if (clock < )
{
cout << "中午" << endl;
}
else if (clock < )
{
cout << "下午" << endl;
}
else
{
if (task == true)
{
cout << "下班" << endl;
}
else
{
if (clock < )
{
cout << "晚上,加班" << endl;
} cout << "好累,睡着了" << endl;
}
}
} int main() { work(, false);
work(, false);
work(, false);
work(, false); return ;
}

  代码 State模式 from 《大话设计模式》

 #include <string>
#include <iostream> using namespace std; struct Context;
struct State {
virtual void work(Context c) = ;
}; struct Context {
bool taskFinish = false;
unsigned clock = ;
State* _state;
void work() { this->_state->work(*this); }
}; struct SleepState : public State {
virtual void work(Context c) override {
cout << "sleeping..." << endl;
}
}; struct EveningState : public State {
virtual void work(Context c) override {
if (c.taskFinish == true)
cout << "back home" << endl;
else
{
if (c.clock < )
cout << "evening" << endl;
else
c._state = new SleepState();
}
}
}; struct AfternoonState : public State {
virtual void work(Context c) override {
if (c.clock < )
cout << "afternoon" << endl;
else
c._state = new EveningState();
}
}; struct NoonState : public State {
virtual void work(Context c) override {
if (c.clock < )
cout << "noon" << endl;
else
c._state = new AfternoonState();
}
}; struct ForenoonState : public State {
virtual void work(Context c) override {
if (c.clock < )
cout << "forenoon" << endl;
else
c._state = new NoonState();
}
}; int main() {
Context project;
project._state = new ForenoonState(); project.work(); project.clock = ;
project.work(); project.clock = ;
project.work(); project.clock = ;
project.work(); return ;
}

  要点总结
  #State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
  #为不同的状态引入不同的对象,使得状态转化变得更加明确,而且可以保证不会出现状态不一致的情况,因为转换时原子性的——即要么彻底转换过来,要么不转换。
  #如果State对象没有实例变量,那么各个上下文可以共享同一个State对象,从而节省对象开销。

C++设计模式 之 “状态变化” 模式:State、Memento的更多相关文章

  1. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  2. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  3. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  4. C#设计模式:备忘录模式(Memento Pattern)

    一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...

  5. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  6. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  7. 设计模式2——状态模式State

    参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...

  8. 【Unity与23种设计模式】备忘录模式(Memento)

    GoF中定义: "在不违反封装的原则下,获取一个对象的内部状态并保留在外部,让对象可以在日后恢复到原先保留时的状态." 对于一些需要存储的数据,比如历史最高分 当与得分减分系统写入 ...

  9. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

随机推荐

  1. CodeForces - 779D String Game 常规二分

    题意:给你两个串,S2是S1 的一个子串(可以不连续).给你一个s1字符下标的一个排列,按照这个数列删数,问你最多删到第几个时S2仍是S1 的一个子串. 题解:二分删掉的数.判定函数很好写和单调性也可 ...

  2. MySQL在windows下的图形安装

    1.mysql官网下载mysql-5.5.53-winx64.msi文件并保存到磁盘相应目录. 2.图形化安装mysql数据库: 1)双击mysql-5.5.53-winx64.msi,出现欢迎界面, ...

  3. JSON.stringify() 格式化 输出log

    调试程序的过程中,我们打印一个日志: console.log(object);,其中object是任意的一个json对象. 在控制台就会看到[object object],而看不到具体的内容. 我们可 ...

  4. 洛谷P4437 排列 [HNOI/AHOI2018] 贪心

    正解:贪心 解题报告: 传送门! 发现做题龟速,,,所以懒得写题目大意辣自己get一下QAQ 首先看到ai<=n,又当ai=j时j在i的前面,所以就变成对于每个点i有一个约束,即要求第ai个节点 ...

  5. [python-opencv] 模糊操作

    @不要在奋斗的年纪 选择安逸 均值模糊 中值模糊 自定义模糊 意义与应用场景 模糊的基本原理: 1.基于离散卷积 2.定义好每个卷积核 3.不同卷积核得到不同的卷积效果 4.模糊是卷积的一种表象 #均 ...

  6. promise VS future

    Future and Promise are the two separate sides of an asynchronous operation. promise is used by the & ...

  7. 安装HDF5及在VS下配置HDF5

    最近要用到HDF5来存储数据,想要安装尝试用一下.发现网上有两种安装方式,一种是obtain518.html:获取最新的HDF5-1.8软件;另一种是cmakebuild518.html:使用CMAK ...

  8. 自定义WordPress文件上传路径

    自WordPress 3.5版本开始,隐藏了后台媒体设置页面的“默认上传路径和文件的完整URL地址”选项,可以通过下面的代码将该选项调出来. 将下面的代码添加到当前主题functions.php文件中 ...

  9. 软件包管理:yum在线管理-yum命令

    只要我们的电脑可以接入互联网,那么yum源就是配好的,yum命令可以直接使用. 列出的是服务器上全部的rpm包. 包名,包全名的概念只在rpm手动管理时有用. 关键字主要指包名,只要知道了关键字就可以 ...

  10. 9/24matplotlib使用入门

    ---恢复内容开始--- matplotlib的使用中有好几种输出风格,有matlab风格,和官方文档的as风格,各有所长,本文对比介绍官方文档中的使用风格. 我们画图的目的是要将函数以图像显示出来, ...