一、状态模式解释
在状态模式(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 }
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 }
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 }
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 }
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 }
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 }
运行结果
您申请的卡在制作中,请等候。。。 您已经领卡,卡的状态为未激活,需要进行激活。 您执行了激活动作,卡的状态为正常!
三、总结
状态模式与策略模式比较(后续补充)。
状态模式与模版模式的比较(后续补充)。
来源:https://www.cnblogs.com/fating/p/12399210.html