1、简介

在日常开发中,某些对象的状态如果发生改变,对应的行为也将发生改变,那么如何在运行时根据对象的状态动态的改变对象的行为,同时不产生紧耦合关系(即使用if else或者swith所带来的紧耦合关系).即对扩展开放,对修改关闭一开闭原则.

2、案例

假设用户提出了一个需求,有三类文档对象,他们都由Read、Update、Write的功能,且分为只读文档、只改文档、只写文档,且在编写代码时,他们的RUW(R-Read)功能各不相同,即每一类的状态文档,在运行时,他们的Read、Write、Update的代码逻辑各不相同,这个时候该如何通过状态模式编写代码,很显然,如果不用State模式,可以通过if else或者swith可以很轻松的完成需求.但是那样的代码耦合度高,且修改时,代价太大,容易影响现有代码的逻辑,给测试增加压力,因为你每一次对单一文档对象的修改都会影响其他所有文档对象的运行.下面使用State状态模式来完成这个需求.

3、代码实战

    public static void Main(string[] args)
{
var manager = new DocumentManage(new ReadOnlyDocument());
var content=manager.Read();
Console.WriteLine(content);
Console.ReadKey();
} /// <summary>
/// 状态文档方法约束接口
/// </summary>
public interface IStatedDocument
{
string Read(); void Write(); void Update();
} /// <summary>
/// 抽象状态文档对象
/// </summary>
public abstract class StatedDocument: IStatedDocument
{
public abstract string Read();
public abstract void Write();
public abstract void Update();
} /// <summary>
/// 只读文档对象
/// </summary>
public class ReadOnlyDocument : StatedDocument
{
public override string Read()
{
return "只读文档内容";
} public override void Update()
{
throw new Exception("只读文档,无法修改其内容");
} public override void Write()
{
throw new Exception("只读文档,无法写入内容");
}
} /// <summary>
/// 文档管理对象
/// </summary>
public class DocumentManage: IStatedDocument
{ private StatedDocument _statedDocument; /// <summary>
/// 可以通过构造函数传入具体的文档,或者Set方法
/// </summary>
public DocumentManage(StatedDocument statedDocument)
{
_statedDocument = statedDocument;
} public string Read()
{
return _statedDocument.Read();
} public void Update()
{
_statedDocument.Update();
} public void Write()
{
_statedDocument.Write();
}
}

ok,可以看到state状态模式很好的完成了需求,而且每当用户提出一种新的需求,如编写一个只读只写文档,你就可以通过扩展类的方式,通过编写一个只读只写文档类,来完成他的需求,而且每次发布模块,只需要测新类型的功能是否ok,不需要测其他的功能,因为状态模式是符合开闭原则,对扩展方法,对修改关闭.且所有的上下文共享一个State对象,各个状态文档对象通过子类的方法展现,如果状态发生改变,那么其状态下的方法全都会改变.

State状态模式的更多相关文章

  1. C++设计模式-State状态模式

    State状态模式作用:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. UML图如下: State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为. ...

  2. 设计模式---状态变化模式之state状态模式(State)

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

  3. 设计模式21:State 状态模式(行为型模式)

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

  4. 19、State 状态模式

    “人有悲欢离合,月有阴晴圆缺”,包括人在内,很多事物都具有多种状态,而且在不同状态下会具有不同的行为,这些状态在特定条件下还将发生相互转换.就像水,它可以凝固成冰,也可以受热蒸发后变成水蒸汽,水可以流 ...

  5. 程序设计模式 —— State 状态模式

    我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...

  6. JAVA设计模式--State(状态模式)

    状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...

  7. 设计模式之 State 状态模式

    状态模式的核心在于 1. 状态的转换导致行为(Handle)的差异,比如人的状态是饿的时候,吃(Handle)的行为是2个馒头,人状态是不太饿的时候,吃(Handle)的行为是半个馒头 2. Stat ...

  8. State 状态模式

    简介 状态模式允许一个对象在其内部[状态]改变的时候改变其[行为].这个对象看上去就像是改变了它的类一样. 用一句话来表述,状态模式把所研究的对象的[行为]包装在不同的[状态对象]里,[每一个状态对象 ...

  9. 设计模式 ( 十八 ):State状态模式 -- 行为型

    1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对 ...

随机推荐

  1. 最大熵与最大似然,以及KL距离。

    DNN中最常使用的离散数值优化目标,莫过于交差熵.两个分布p,q的交差熵,与KL距离实际上是同一回事. $-\sum plog(q)=D_{KL}(p\shortparallel q)-\sum pl ...

  2. Spark1.5.0 + Hadoop2.7.1整合

    Hadoop2.7.1已经配置完毕. Hosts分配如下: master 172.16.15.140 slave1 172.15.15.141 slave2 172.16.15.142 一.安装Sca ...

  3. ELK的文档搭建

    一.安装elasticsearch 官网:https://www.elastic.co/guide/index.html https://www.elastic.co/guide/en/elastic ...

  4. (PMP)解题技巧和典型题目分析(0903-2班)

    1.计算题 ,5 2.概念题,少 3.情景题,很多 C B C D ------------------------------------------------------------------ ...

  5. 使用mybatis plus 操作数据库

    mybatis plus 是基于mybatis 的一个增强包,比 mybatis 更加容易使用. 特点: 1.分页支持 2.支持自定义查询. 3.简单的情况下,不需要写map.xml 文件 4.支持租 ...

  6. 即时消息Toast和对话框

    public static Toast makeText(Context context, CharSequence text, int duration) protected void onDest ...

  7. 基于模型的特征选择详解 (Embedded & Wrapper)

    目录 基于模型的特征选择详解 (Embedded & Wrapper) 1. 线性模型和正则化(Embedded方式) 2. 基于树模型的特征选择(Embedded方式) 3. 顶层特征选择算 ...

  8. android-读取MediaProvider

    1.MediaProvider存储手机中的媒体文件,用 SQLite 数据库存储图片.视频.音频等多媒体文件的信息,供视频播放器.音乐播放器.图库使用.以 root 权限进入 adb shell,使用 ...

  9. zabbix 自带监控项报性能问题解决方法

    类似报警信息为:Zabbix discoverer processes more than 75% busy 解决方法:修改zabbix_server配置 原因:每个discovery任务在一定时间内 ...

  10. Exp6 信息搜集与漏洞扫描——20164325王晓蕊

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 2.1 各种搜索技巧的应用 2.1.1 Netcraft查询 Netcraft这个网站可以查询到特定网站的IP地址,以wei ...