打字猴:1.700473646e+09
1700473646
1700473647 super.context.setLiftState(Context.runningState);
1700473648
1700473649 super.context.getLiftState().run();
1700473650
1700473651 }
1700473652
1700473653 //停止状态是怎么发生的呢?当然是停止方法执行了
1700473654
1700473655 @Override
1700473656
1700473657 public void stop(){
1700473658
1700473659 System.out.println(“电梯停止了……”);
1700473660
1700473661 }
1700473662
1700473663 }
1700473664
1700473665 业务逻辑都已经实现了,我们看看怎么来模拟场景类,如代码清单26-13所示。
1700473666
1700473667 代码清单26-13 场景类
1700473668
1700473669 public class Client{
1700473670
1700473671 public static void main(String[]args){
1700473672
1700473673 Context context=new Context();
1700473674
1700473675 context.setLiftState(new ClosingState());
1700473676
1700473677 context.open();
1700473678
1700473679 context.close();
1700473680
1700473681 context.run();
1700473682
1700473683 context.stop();
1700473684
1700473685 }
1700473686
1700473687 }
1700473688
1700473689 Client场景类太简单了,只要定义一个电梯的初始状态,然后调用相关的方法,就完成了,完全不用考虑状态的变更,运行结果完全相同,不再赘述。
1700473690
1700473691 我们再来回顾一下我们刚刚批判的上一段代码。首先是代码太长,这个问题已经解决了,通过各个子类来实现,每个子类的代码都很短,而且也取消了switch……case条件的判断。其次是不符合开闭原则,那如果在我们这个例子中要增加两个状态应该怎么做呢?增加两个子类,一个是通电状态,一个是断电状态,同时修改其他实现类的相应方法,因为状态要过渡,那当然要修改原有的类,只是在原有类中的方法上增加,而不去做修改。再次是不符合迪米特法则,我们现在的各个状态是单独的类,只有与这个状态有关的因素修改了,这个类才修改,符合迪米特法则,非常完美!这就是状态模式。
1700473692
1700473693
1700473694
1700473695
[ 上一页 ]  [ :1.700473646e+09 ]  [ 下一页 ]