设计模式之第21章-状态模式(Java实现)
“what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊。话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武功的,想不无敌都难啊,还有那个blablabla”(作者已被拖走)。咳咳,今天那个状态哥哥马不停蹄的赶过来,下面闪亮登场。
状态模式之自我介绍
今天不在状态,可能是由于宇宙差的原因,好了,先说下定义:Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.也就是说当一个对象内在改变的时候允许其改变行为,这个对象看起来像改变了其类。本人的核心就是“封装”,没错,不是传说中的“银鳞胸甲”的蓝装。状态的变更会引起行为的变更,从外部看来就像这个对象对应的类发生了改变一般,哥们的通用类图如下:
鱼哥不在我就多扯一点:Context将与状态相关的请求委托给当前的ConcreteState对象处理,然后呢,Context可以将自身作为一个参数传递给处理该请求的状态对象,使得状态对象在必要时可以访问Context,Context是客户使用的主要接口,客户可用状态对象来配置一个Context,一旦一个Context配置完毕,它的客户不再需要直接与状态对象打交道。Context或者ConcreteState子类都可以决定哪个状态是另外哪一个的后继,以及是在何种条件下进行状态转换的。
状态模式之自我分析
首先介绍下如下的优点:
- 将与特定状态相关的行为局部化,并且将补不同状态的行为分割开来很好的体现了开放原则以及单一职责原则。增加状态以及修改状态变得简单易行。
- 避免了程序的复杂性,提高了系统的可维护性。使得结构清晰。
- State对象可被共享。
金无足赤,人无完人,我自然也不能例外了,缺点其实就一个:
- 状态过多的话,就会使得子类膨胀了。
状态模式之实现
今天我们就以作者大大昨晚的活动来举栗子说明如何实现,首先我们实现下Context的类,这个是很重要的,代码如下:
1 public class Context{ 2 //定义状态 3 public final static State STATE1 = new ConcreteState1(); 4 public final static State STATE2 = new ConcreteState2(); 5 6 //当前状态 7 private State CurrentState; 8 9 10 //get方法获取当前状态 11 public State getCurrentState(){ 12 return CurrentState; 13 } 14 //set方法设置当前状态 15 public State setCurrentState(State currentState){ 16 this.CurrentState = currentState; 17 18 //切换状态 19 this.CurrentState.setContext(this); 20 } 21 22 //行为委托 23 public void handle1(){ 24 this.CurrentState.handle1(); 25 } 26 27 public void handle2(){ 28 this.CurrentState.handle2(); 29 } 30 31 }