State 状态模式(行为型模式)

动机(Motivation)

在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同。

如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合?

意图(Intent)

允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。——《设计模式》GoF

结构(Structure)

示例代码

    public enum DocumentState{ReadOnly,Editable}public class Document{private DocumentState state;public void Handle(){if (state == DocumentState.ReadOnly){//...
            }else if (state == DocumentState.Editable){//...
            }}}

当DocumentState改变时,也会引起Document的改变,这时就需要解耦:

    public abstract class StatedDocument//抽象类——表示状态及依赖状态的行为,它是稳定的
    {public abstract void Handle1();public abstract void Handle2();public abstract void Handle3();}public class ReadOnlyStatedDocument : StatedDocument{public override void Handle1(){//...
        }public override void Handle2(){//...
        }public override void Handle3(){//...
        }}public class EditableStatedDocument : StatedDocument{public override void Handle1(){//...
        }public override void Handle2(){//...
        }public override void Handle3(){//...
        }}public class Document//main logic 主逻辑
    {private StatedDocument statedDocument;public void SetStatedDocument(StatedDocument statedDocument){this.statedDocument = statedDocument;}public void Handle1()//它不对应状态,而是每个状态会包含的一个方法
        {statedDocument.Handle1();}public void Handle2(){statedDocument.Handle2();}public void Handle3(){statedDocument.Handle2();}}

State模式的几个要点

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

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

转载于:https://www.cnblogs.com/jesselzj/p/4774742.html

设计模式21:State 状态模式(行为型模式)相关推荐

  1. 5.8 设计模式之State(状态)—对象行为型模式

    5.8 State(状态)-对象行为型模式 参考文章 意图 状态模式是一种行为设计模式, 改变一个对象的内部状态进而改变其行为. 问题及情景 状态模式与有限状态机的概念紧密相关. 其主要思想是程序在任 ...

  2. 23种设计模式介绍(一)---- 创建型模式

    由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读.于是我把它分为三篇文章 23种设计模式介绍(一)---- 创建型模式 23种设计模式介绍(二)---- 结构型模式 23种设计模 ...

  3. 【设计模式】(八)--创建型模式--建造者模式

    [设计模式](八)–创建型模式–建造者模式 建造者模式 [设计模式](八)--创建型模式--建造者模式 建造者模式定义 构造者模式的优点 构造者模式的使用场景 构造者模式和工厂模式区别 构造者模式简单 ...

  4. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  5. 设计模式之 State(状态模式)通俗理解

    23种设计模式 1 State 模式的定义 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 2 何时使用? 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了它的类.状态模式 ...

  6. 【设计模式】三大类:创建型模式、结构型模式、行为型模式

    1 创建型模式 本人理解:以C++为例,创建对象时,用关键字new来创建(实例化)对象.用一个函数或类将new的过程封装起来,就是创建型模式. <设计模式>中的描述: 创建型模式抽象了实例 ...

  7. python与网页设计的区别_Python与设计模式(三):行为型模式(上)

    接前文:kant li:Python与设计模式(二):结构型模式(下)​zhuanlan.zhihu.com 行为型模式主要处理对象间的通信问题,包括责任链模式.命令模式.解释器模式.迭代器模式.观察 ...

  8. iOS开发 - 面向对象设计的设计模式(一):创建型模式(附 Demo UML类图)

    继上一篇的面向对象设计的设计原则,本篇是面向对象设计系列的第二个部分:面向对象设计的设计模式的第一篇文章. 另外,本篇博客的代码和类图都保存在我的GitHub库中:中的Chapter2. 最开始说一下 ...

  9. 设计模式其实很简单之行为型模式

    关注公众号获取更多资料 设计模式- 行为型模式 ​ 行为型模式描述的死程序运行时复杂的流程控制,描述了多个类或者对象之间怎样相互协调合作,涉及算法与对象之间的职责分配. ​ 行为型模式是23中设计模式 ...

  10. .NET设计模式(7):创建型模式专题总结(Creational Pattern)

    概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模 ...

最新文章

  1. buu 信息化时代的步伐
  2. 简单入门Javascript正则表达式
  3. js中数据结构数组Array、映射Map、集合Set、对象、JSON
  4. c语言中自定义函数的流程图这么画,c语言流程图怎么画?
  5. pdf拆分成一页一页
  6. 单片机音频谱曲软件_单片机谱曲软件讲解
  7. 打印显示服务器脱机win10,如何在Win10中将打印机状态从脱机更改为联机
  8. 苹果自带的清理软件_苹果清理软件哪个好,哪个更适合自己 - 単子
  9. 猫哥教你写爬虫 033--爬虫初体验-BeautifulSoup-作业
  10. 人脸自收集数据集辅助制作工具——多人在线协同标注系统
  11. 第5-6周-实验作业-串口通信小试
  12. #WebStorm激活码失效解决方法!
  13. 有关颜色敏感度测试的软件是啥,测试你对颜色的敏感度,最后一题能答对算你厉害!...
  14. 重磅开源:基于.NET 6.0 自研轻量级ORM框架
  15. 好用的软件推荐,值得收藏
  16. 一文读懂VMware虚拟化技术(含超融合)
  17. 三星 i9100官方刷机
  18. mysql installer安装_MySQL Installer 8.0.21安装教程图文详解
  19. Python学习之魔法方法
  20. 使用Microsoft Edge浏览器时,怎么让alt+tab不切换他的子标签页而只在程序间切换?

热门文章

  1. 在idea里如何实现Git项目回滚
  2. Mac下安装jdk8
  3. mysql中的函数有哪些?(2.控制流函数)
  4. 微信PC版近期更新的几个功能,你都会用吗?
  5. Linux有关Shell算数运算的用法补充笔记
  6. 11个常用的SQL技巧
  7. timed_waiting线程是否占用cpu_程序CPU占用率飙升,如何定位线程的堆栈信息?超详细,值得收藏看不懂还有配套视频 第319篇...
  8. jdbc.properties文件
  9. NOT运算符与运算符
  10. 华为架构师谈如何理解运用模块与微服务