设计模式--状态模式

送分小仙女□ 提交于 2020-03-03 00:56:45

一、状态模式解释

在状态模式(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

 

运行结果

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

三、总结

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

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

     

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!