State???
State模式中,我们用类来表示状态。以类来表示状态后,我们就能通过切换类来方便地改变对象的状态。当需要增加新的状态时,如何修改代码这个问题也会很明确。
- 直接用状态代替硬编码
 依赖于状态的处理,来执行具体的操作
理清职责

- 实现功能:
·有一个金库 ·金库与警报中心相连 ·金库里有警铃和正常通话用的电话·金库里有时钟,监视着现在的时间 ·白天的时间范围是9:00~16:59,晚上的时间范围是17:00~23:59和0:00~8:59 ·金库只能在白天使用 ·白天使用金库的话,会在警报中心留下记录 ·晚上使用金库的话,会向警报中心发送紧急事态通知 ·任何时候都可以使用警铃 ·使用警铃的话,会向警报中心发送紧急事态通知 ·任何时候都可以使用电话(但晚上只有留言电话) ·白天使用电话的话,会呼叫警报中心 ·晚上用电话的话,会呼叫警报中心的留言电话 名字=======》》》》》说明
State ||表示金库状态的接口
DayState ||表示“白天”状态的类。它实现了State接口
NightState ||表示“晚上”状态的类。它实现了State接口
Context ||表示管理金库状态,并与警报中心联系的接口
SafeFrame ||实现了Context接口。在它内部持有按钮和画面显示等UI信息
Main || 测试程序行为的类
- 使用与不使用状态模式对比
- 不使用
使用金库时被调用的方法(){ if(白天){ 向警报中心报告使用记录 ]elseif(晚上){ 向警报中心报告紧急事态 警铃响起时被调用的方法(){ 向警报中心报告紧急事态 正常通话时被调用的方法(){ if(白天){ 呼叫警报中心 }elseif(晚上){ 呼叫警报中心的留言电话 }  - 使用
表示百天的状态的类{ 使用金库时被调用的方法(){ 向警报中心报告使用记录 警铃响起时被调用的方法(){ 向警报中心报告紧急事态 正常通话时被调用的方法(){ 呼叫警报中心 表示晚上的状态的类{ 使用金库时被调用的方法(){ 向警报中心报告紧急事态 警铃响起时被调用的方法(){ 向警报中心报告紧急事态 正常通话时被调用的方法(){ 呼叫警报中心的留言电话  - 相关设计模式  ◆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     
                        
                        
                    