一、简介ide
在平常开发中,某些对象的状态若是发生改变,对应的行为也将发生改变,那么如何在运行时根据对象的状态动态的改变对象的行为,同时不产生紧耦合关系(即便用if else或者swith所带来的紧耦合关系).即对扩展开放,对修改关闭一开闭原则.函数
二、案例测试
假设用户提出了一个需求,有三类文档对象,他们都由Read、Update、Write的功能,且分为只读文档、只改文档、只写文档,且在编写代码时,他们的RUW(R-Read)功能各不相同,即每一类的状态文档,在运行时,他们的Read、Write、Update的代码逻辑各不相同,这个时候该如何经过状态模式编写代码,很显然,若是不用State模式,能够经过if else或者swith能够很轻松的完成需求.可是那样的代码耦合度高,且修改时,代价太大,容易影响现有代码的逻辑,给测试增长压力,由于你每一次对单一文档对象的修改都会影响其余全部文档对象的运行.下面使用State状态模式来完成这个需求.spa
三、代码实战code
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对象,各个状态文档对象经过子类的方法展示,若是状态发生改变,那么其状态下的方法全都会改变.对象