本篇文章主要介绍了"处理管线详解 设计模式详解(六)----------状态模式",主要涉及到处理管线详解方面的内容,对于软件工程感兴趣的同学可以参考一下:
各位朋友,本次LZ分享的是状态模式,在这之前,恳请LZ解释一下,由于最近公司事情多,比较忙,所以导致更新速度稍微慢了些(哦,往后LZ会越来越忙=。=)。状态...
各位朋友,本次LZ分享的是状态模式,在这之前,恳请LZ解释一下,由于最近公司事情多,比较忙,所以导致更新速度稍微慢了些(哦,往后LZ会越来越忙=。=)。
状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。
状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
这里LZ给大家举例子,海贼王中路飞在打多弗朗明哥的时候,首先是普通状态,然后发怒开启二挡状态,被多弗朗明哥嘲笑速度快,但是力量低,于是开启三挡状态,又被嘲笑力量够了,但是速度差远了,路飞被逼急,于是开启四挡,最终打败了多弗朗明哥。现在我们通过代码实现这样的一个过程。
这里我们发现路飞的状态经历了普通,二挡,三挡,四挡,共四个状态,我们创建一个实例变量state来持有目前的状态,然后定义每个状态的值
publicfinalstaticint ORDINARY = 0;//普通状态publicfinalstaticint SECONDGEAR = 1;//二挡状态publicfinalstaticint THIRDGEAR = 2;//三挡状态publicfinalstaticint FOURTHGEAR = 3;//四挡状态privateint state = ORDINARY;//由于路飞一开始是普通状态,所以我们初始化state为ORDINARY
接下来我们实现LuFei这个类
publicclass LuFei {
publicfinalstaticint ORDINARY = 0;//普通状态publicfinalstaticint SECONDGEAR = 1;//二挡状态publicfinalstaticint THIRDGEAR = 2;//三挡状态publicfinalstaticint FOURTHGEAR = 3;//四挡状态privateint state = ORDINARY;//由于路飞一开始是普通状态,所以我们初始化state为ORDINARYpublicvoid setstate(int state) {
this.state = state;
}
publicvoid change(){
if(state == SECONDGEAR){
System.out.println("路飞开启二挡战斗");
}elseif(state == THIRDGEAR){
System.out.println("路飞开启三挡战斗");
}elseif(state == FOURTHGEAR){
System.out.println("路飞开启四挡战斗");
}else{
System.out.println("路飞当前为普通状态战斗");
}
}
}
现在我们写个测试类
publicclass TestLuFei {
publicstaticvoid main(String[] args) {
LuFei luFei = new LuFei();
luFei.setstate(luFei.SECONDGEAR);
luFei.change();
luFei.setstate(luFei.THIRDGEAR);
luFei.change();
luFei.setstate(luFei.FOURTHGEAR);
luFei.change();
luFei.setstate(luFei.ORDINARY);
luFei.change();
}
}

这里可以看到,通过状态的改变,路飞会以不同的状态进行战斗。
该来了总躲不过,那就是,变更需求!
这里,路飞在第一次变四挡后,并没有打败多弗朗明哥,而是因为四挡导致进入了第五个状态:虚弱状态,现在我们还要再加上一个if语句,把虚弱状态扔进去。这里就看出了问题,我们这个由于需求及其简单,所以代码特别简洁,但是倘若这是一个复杂的业务,我们每一次变更状态难道都要在类中增加if else语句或者是新的业务逻辑吗?这显然违背了我们的设计原则:封装变化原则。(这里各位可能会突然想起来策略模式,那里也用到了这个原则。)
现在,让我们重写代码,将每个状态对象封装到各自的类中,然后在动作发生时委托给当前对象。我们的步骤为:
1.首先,我们创建一个state的接口,我们把每个状态共有的change方法放在这个接口中
2.接下来,我们让每一个状态都实现状态类,这些类将负责在对应的状态下进行相应行为
3.最后,我们将动作委托到状态类中