设计模式--状态模式

Posted fating

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--状态模式相关的知识,希望对你有一定的参考价值。

一、状态模式解释

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

角色:

A:环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。

B:抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。

C:具体状态(Concrete State)角色:实现抽象状态所对应的行为。

 

二、模式例子

主要演示发一张借记卡的状态变化。

A:环境(Context)角色:

技术图片
 1 package comm.pattern.action.state;
 2 
 3 /**
 4  * 
 5  * @Title: Context.java
 6  * @Package: comm.pattern.action.state
 7  * @Description: 上下文类
 8  * @author yangzhancheng
 9  * @2020年3月3日:上午12:17:02
10  *
11  */
12 public class Context {
13 
14     private ICardState cardState;
15 
16     public void  setCardState(ICardState cardState) {
17         this.cardState = cardState;
18     }
19 
20     public void action(){
21         cardState.action();
22     }
23 
24 }
View Code

 

B:抽象状态(State)角色:

技术图片
 1 package comm.pattern.action.state;
 2 
 3 /**
 4  * 
 5  * @Title: ICardState.java
 6  * @Package: comm.pattern.action.state
 7  * @Description: 状态的接口类
 8  * @author yangzhancheng
 9  * @2020年3月3日:上午12:14:31
10  *
11  */
12 public interface ICardState {
13 
14     void action();
15 }
View Code

 

C:具体状态(Concrete State)角色

C-1:制卡阶段

技术图片
 1 package comm.pattern.action.state;
 2 
 3 /**
 4  * 
 5  * @Title: IssueCardState.java
 6  * @Package: comm.pattern.action.state
 7  * @Description: 申请卡时,卡的状态为发卡中
 8  * @author yangzhancheng
 9  * @2020年3月3日:上午12:21:26
10  *
11  */
12 public class IssueCardState implements ICardState {
13 
14     @Override
15     public void action() {
16         System.out.println("您申请的卡在制作中,请等候。。。");
17     }
18 
19 }
View Code

C-1:领卡阶段

技术图片
 1 package comm.pattern.action.state;
 2 
 3 /**
 4  * 
 5  * @Title: UactiveCardState.java
 6  * @Package: comm.pattern.action.state
 7  * @Description: 领取卡,卡的状态为为激活
 8  * @author yangzhancheng
 9  * @2020年3月3日:上午12:20:58
10  *
11  */
12 public class UactiveCardState implements ICardState {
13 
14     @Override
15     public void action() {
16         System.out.println("您已经领卡,卡的状态为未激活,需要进行激活。");
17     }
18 
19 }
View Code

C-1:激活阶段

技术图片
 1 package comm.pattern.action.state;
 2 
 3 /**
 4  * 
 5  * @Title: ActiveCardState.java
 6  * @Package: comm.pattern.action.state
 7  * @Description: 激活卡的状态
 8  * @author yangzhancheng
 9  * @2020年3月3日:上午12:19:29
10  *
11  */
12 public class ActiveCardState implements ICardState {
13 
14     @Override
15     public void action() {
16         System.out.println("您执行了激活动作,卡的状态为正常!");
17     }
18 
19 }
View Code

D:客户端使用

技术图片
 1 package comm.pattern.action.state;
 2 
 3 /**
 4  * 
 5  * @Title: Client.java
 6  * @Package: comm.pattern.action.state
 7  * @Description: 描述该文件做什么
 8  * @author yangzhancheng
 9  * @2020年3月3日:上午12:27:41
10  *
11  */
12 public class Client {
13 
14     public static void main(String[] args) {
15 
16         Context context = new Context();
17       
18         //1.发卡阶段
19         context.setCardState(new IssueCardState());
20         context.action();
21         
22         //2.领卡阶段
23         context.setCardState(new UactiveCardState());
24         context.action();
25         
26         //3.激活阶段
27         context.setCardState(new ActiveCardState());
28         context.action();
29     }
30 
31 }
View Code

 

运行结果

您申请的卡在制作中,请等候。。。
您已经领卡,卡的状态为未激活,需要进行激活。
您执行了激活动作,卡的状态为正常!

三、总结

      状态模式与策略模式比较(后续补充)。

      状态模式与模版模式的比较(后续补充)。

     

以上是关于设计模式--状态模式的主要内容,如果未能解决你的问题,请参考以下文章

用于从 cloudkit 检索单列的代码模式/片段

是否有在单个活动中处理多个片段的 Android 设计模式?

方向/配置更改后如何维护 ListView 片段状态?

为不同方向使用不同布局时,在方向更改时保存片段状态

Sublime text3最全快捷键清单

csharp C#代码片段 - 使类成为Singleton模式。 (C#4.0+)https://heiswayi.github.io/2016/simple-singleton-pattern-us