1700473697
设计模式之禅 26.2 状态模式的定义
1700473698
1700473699
上面的例子中多次提到状态,本节讲的就是状态模式,什么是状态模式呢?其定义如下:
1700473700
1700473701
Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。)
1700473702
1700473703
状态模式的核心是封装,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发生了改变一样。状态模式的通用类图如图26-5所示。
1700473704
1700473705
1700473706
1700473707
1700473708
图26-5 状态模式通用类图
1700473709
1700473710
我们先来看看状态模式中的3个角色。
1700473711
1700473712
❑State——抽象状态角色
1700473713
1700473714
接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。
1700473715
1700473716
❑ConcreteState——具体状态角色
1700473717
1700473718
每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。
1700473719
1700473720
❑Context——环境角色
1700473721
1700473722
定义客户端需要的接口,并且负责具体状态的切换。
1700473723
1700473724
状态模式相对来说比较复杂,它提供了一种对物质运动的另一个观察视角,通过状态变更促使行为的变化,就类似水的状态变更一样,一碗水的初始状态是液态,通过加热转变为气态,状态的改变同时也引起体积的扩大,然后就产生了一个新的行为:鸣笛或顶起壶盖,瓦特就是这么发明蒸汽机的。我们再来看看状态模式的通用源代码,首先来看抽象环境角色,如代码清单26-14所示。
1700473725
1700473726
代码清单26-14 抽象环境角色
1700473727
1700473728
public abstract class State{
1700473729
1700473730
//定义一个环境角色,提供子类访问
1700473731
1700473732
protected Context context;
1700473733
1700473734
//设置环境角色
1700473735
1700473736
public void setContext(Context_context){
1700473737
1700473738
this.context=_context;
1700473739
1700473740
}
1700473741
1700473742
//行为1
1700473743
1700473744
public abstract void handle1();
1700473745
[
上一页 ]
[ :1.700473696e+09 ]
[
下一页 ]