C++设计模式 之 “状态变化” 模式:State、Memento
“状态变化”模式
在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。
典型模式
# 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的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- C#设计模式:备忘录模式(Memento Pattern)
一,C#设计模式:备忘录模式(Memento Pattern) 1.发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据.负责创建一个备忘录Memento,用以记录当前 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式2——状态模式State
参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...
- 【Unity与23种设计模式】备忘录模式(Memento)
GoF中定义: "在不违反封装的原则下,获取一个对象的内部状态并保留在外部,让对象可以在日后恢复到原先保留时的状态." 对于一些需要存储的数据,比如历史最高分 当与得分减分系统写入 ...
- 设计模式之状态模式(State)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
随机推荐
- MapReduce的分区
第一部分 分区简述(比如国家由省市来划分) 分区:map的输出经过partitioner分区进行下一步的reducer.一个分区对应一个reducer,就会使得reducer并行化处理任务.默认为1 ...
- HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- CSU 1808 - 地铁 - [最短路变形]
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808 Time limit: 5000 ms Memory limit: 13107 ...
- Docker命令详解(build篇)
命令格式:docker build [OPTIONS] <PATH | URL | -> Usage: Build an image from a Dockerfile. 中文意思即:使用 ...
- Ubuntu 16.04配置国内高速apt-get更新源
https://www.linuxidc.com/Linux/2017-11/148627.htm Ubuntu 16.04下载软件速度有点慢,因为默认的是从国外下载软件,那就更换到国内比较好的快速更 ...
- Linux下Miniconda量化环境安装
前言 linux目录相关知识 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理解为C:/Windows/System32./usr/local:用户级的程序目录,可以理解为 ...
- Intellij Idea常用配置设置
1.配置Intellij Idea的配置文件从默认c盘转移到其他盘符 找到Intellij idea的安装文件,在bin目录下找到idea.properties配置文件,如下把Idea的配置文件夹和I ...
- Code--POJ1850
Description Transmitting and memorizing information is a task that requires different coding systems ...
- sql server递归日期
在做项目任务时,需要将一个日期范围转换为日期表. 例如:日期范围(2017年01月21日~2017年02月20日).转换成一日为单位的日期表,如下. 2017-01-21 2017-01-22 201 ...
- [LeetCode] 821. Shortest Distance to a Character_Easy tag: BFS
Given a string S and a character C, return an array of integers representing the shortest distance f ...