极速理解设计模式系列:22.状态模式(State Pattern)

简介:

四个角色:抽象状态类(State)、具体状态类(ConcreateState)、情景类(Context)、客户端(Client) 

        抽象状态类(State):提供一个与情景类有关的State行为。

        具体状态类(ConcreateState):实现这个行为,实现一个状态。

        情景类(Context):维护一个State的实例对象,并且提供一个客户操作置换状态的接口。

        客户端(Client):直接调用情景类操作即可。

实现思路:直接调用情景类,然后在情景类自动操作或者手动操作置换状态,并且取得不同结果。

类图: 

 

应用场景:文件提交审核入库。

分析:文件创建,然后提交审核,审核通过再入库,入库保存完成进入下一流程。

        下面我们在控制台程序去演示一下如何使用State Pattern:

        一、抽象状态类(State)

 


 
 
  1. //抽象状态类(State) 
  2. public abstract class State 
  3.     public abstract void Submit(FileSub filesub);        

        二、具体状态类(ConcreateState)

 


 
 
  1. //具体状态类(ConcreateState) 
  2. public class BeginState : State 
  3.     public override void Submit(FileSub filesub) 
  4.     { 
  5.         Console.WriteLine("创建文档,提交待审核。"); 
  6.         filesub.SetState(new CheckState()); 
  7.     } 
  8.  
  9. //具体状态类(ConcreateState) 
  10. public class CheckState : State 
  11.     public override void Submit(FileSub filesub) 
  12.     { 
  13.         Console.WriteLine("审核文档,准备入库"); 
  14.         filesub.SetState(new StorageState()); 
  15.     } 
  16.  
  17. //具体状态类(ConcreateState) 
  18. public class StorageState : State 
  19.     public override void Submit(FileSub filesub) 
  20.     { 
  21.         Console.WriteLine("入库完成,准备结束此流程"); 
  22.         filesub.SetState(new CompleteState()); 
  23.     } 
  24.  
  25. //具体状态类(ConcreateState) 
  26. public class CompleteState : State 
  27.     public override void Submit(FileSub filesub) 
  28.     { 
  29.         Console.WriteLine("结束此流程,准备创建下一个文件"); 
  30.         filesub.SetState(new BeginState()); 
  31.     } 

        三、情景类(Context)

 


 
 
  1. //情景类(Context) 
  2. public class FileSub 
  3.     private State state; 
  4.     public FileSub() 
  5.     { 
  6.         state = new BeginState(); 
  7.     } 
  8.     public void SetState(State stateOne) 
  9.     { 
  10.         state = stateOne; 
  11.     } 
  12.     public void Submit() 
  13.     { 
  14.         state.Submit(this); 
  15.     } 

        四、客户端(Client)

 


 
 
  1. //客户端(Client) 
  2. class Program 
  3.     static void Main(string[] args) 
  4.     { 
  5.         FileSub file = new FileSub(); 
  6.         file.Submit(); 
  7.         file.Submit(); 
  8.         file.Submit(); 
  9.         file.Submit(); 
  10.         Console.ReadLine(); 
  11.     } 

       如需源码请点击 StatePattern.rar 下载。


本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827090

相关文章
|
4月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
4月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
4月前
|
设计模式 Java 测试技术
Java设计模式-状态模式(18)
Java设计模式-状态模式(18)
|
5月前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
6月前
|
设计模式 JavaScript Go
js设计模式【详解】—— 状态模式
js设计模式【详解】—— 状态模式
95 7
|
7月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
8月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
|
7月前
|
设计模式
状态模式-大话设计模式
状态模式-大话设计模式
|
7月前
|
设计模式 存储
行为设计模式之状态模式
行为设计模式之状态模式
|
8月前
|
设计模式 Go
[设计模式 Go实现] 行为型~状态模式
[设计模式 Go实现] 行为型~状态模式