State模式(状态设计模式)

 

State???

State模式中,我们用类来表示状态。以类来表示状态后,我们就能通过切换类来方便地改变对象的状态。当需要增加新的状态时,如何修改代码这个问题也会很明确。

  • 直接用状态代替硬编码
    依赖于状态的处理,来执行具体的操作

理清职责

  • 实现功能:
·有一个金库 ·金库与警报中心相连 ·金库里有警铃和正常通话用的电话·金库里有时钟,监视着现在的时间 ·白天的时间范围是9:00~16:59,晚上的时间范围是17:00~23:59和0:00~8:59 ·金库只能在白天使用 ·白天使用金库的话,会在警报中心留下记录 ·晚上使用金库的话,会向警报中心发送紧急事态通知 ·任何时候都可以使用警铃 ·使用警铃的话,会向警报中心发送紧急事态通知 ·任何时候都可以使用电话(但晚上只有留言电话) ·白天使用电话的话,会呼叫警报中心 ·晚上用电话的话,会呼叫警报中心的留言电话 

名字=======》》》》》说明
State ||表示金库状态的接口
DayState ||表示“白天”状态的类。它实现了State接口
NightState ||表示“晚上”状态的类。它实现了State接口
Context ||表示管理金库状态,并与警报中心联系的接口
SafeFrame ||实现了Context接口。在它内部持有按钮和画面显示等UI信息
Main || 测试程序行为的类

  • 使用与不使用状态模式对比
  1. 不使用
使用金库时被调用的方法(){ if(白天){ 向警报中心报告使用记录 ]elseif(晚上){ 向警报中心报告紧急事态 警铃响起时被调用的方法(){ 向警报中心报告紧急事态 正常通话时被调用的方法(){ if(白天){ 呼叫警报中心 }elseif(晚上){ 呼叫警报中心的留言电话 }  
  1. 使用
表示百天的状态的类{ 使用金库时被调用的方法(){ 向警报中心报告使用记录 警铃响起时被调用的方法(){ 向警报中心报告紧急事态 正常通话时被调用的方法(){ 呼叫警报中心 表示晚上的状态的类{ 使用金库时被调用的方法(){ 向警报中心报告紧急事态 警铃响起时被调用的方法(){ 向警报中心报告紧急事态 正常通话时被调用的方法(){ 呼叫警报中心的留言电话  - 相关设计模式  ◆Singleton模式(第5章)Singleton 模式常常会出现在ConcreteState角色中。在示例程序中,我们就使用了Singleton模式。这是因为在表示状态的类中并没有定义任何实例字段(即表示实例的状态的字段)。 ◆Flyweight模式(第20章)在表示状态的类中并没有定义任何实例字段。因此,有时我们可以使用Flyweight模式在多个Context 角色之间共享ConcreteState角色。 

UML

时序图:

Code

  • DayState \NightState State
 public interface State {      //设置时间     void doclock(Context context, int hour);      // 使用金库     void doUse(Context context);      // 按下警铃     void doAlarm(Context context);      // 正常通话     void dophone(Context context);  }  public class NightState implements State {      private NightState() {     }      private static NightState singleton = new NightState();      public static State getInstance() {         return (State) singleton;     }      @Override     public void doclock(Context context, int hour) {         if (hour >= 9 && hour < 17) {             context.changeState(DayState.getInstance());         }     }      @Override     
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信