1.意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
2.描述
状态模式最典型的案例就是传说中的TCP网络连接案例,网络连接有三个状态,连接已建立,正在监听,连接已关闭。当对象处于不同的状态时候可以做出不同的行为。
state模式其实跟strategy模式非常的像。以至于网上都有对这两种模式的集中讨论。已我浅薄的理解认为state由于首先关注的是对象状态,然后再关注其行为,所以在代码实现的时候,需要由谁定义状态的转换是个关键点。目前的网上大部分代码都是通过state子类自身来定义后继状态,不过这个引起的一点是子类之间产生了依赖关系,如果增加一个状态,可能会需要修改原来的子类之间的状态转换代码。
3.例子简介
关于此模式,其实具体上来说比较明确,也不多说,这个是我根据别人的例子写的一段小代码。也就是几个颜色状态之间切换来切换去的小玩意而已,如果例子不对或有误,请指正:
4. 思考
下面的类是对四种颜色状态之间的切换,Red,Green,Black,Blue,如果增加一个颜色Yellow状态,并不像设计模式书里写的直接增加一个子类就可以了,因为由于我下面实现的方式中状态时通过子类来切换的,所以感觉还是要修改个别状态的切换代码才行。
所以最后的感觉使用优势是:
1.解决了if.switch语句的泛滥,使代码简洁了点,但是类多了貌似阅读起来需要查各个类,所以最后阅读方便不方便还是看人而议。
2.状态转换显示化,其实这个还是要看类的命名是否够明确,否则此优势不明显。
其它优势还等将来更深入的体会才能写,或者等大侠补充嘿嘿~
-----------------------------------------------------------分割线----------------------------------------------------------------------------
给出例子:
状态的基类:
package com.gof.chapter5.state.color;
import java.awt.Color;
public abstract class State {
public abstract void handlepPush(Context c);
public abstract void handlePull(Context c);
public abstract Color getcolor();
}
四种状态切换类:
===================RedColor.java=====================
package com.gof.chapter5.state.color; import java.awt.Color; public class RedColor extends State{ private static State redColor = null; @Override public Color getcolor() { // TODO Auto-generated method stub return Color.red; } @Override public void handlePull(Context c) { // TODO Auto-generated method stub c.changeState(BlackColor.instance()); } @Override public void handlepPush(Context c) { // TODO Auto-generated method stub c.changeState(BlueColor.instance()); } public static State instance() { // TODO Auto-generated method stub if(redColor == null)redColor=new RedColor(); return redColor; } }
===================BlueColor.java=====================
package com.gof.chapter5.state.color;
import java.awt.Color;
public class BlueColor extends State{
private static State blueColor = null;
@Override
public Color getcolor() {
// TODO Auto-generated method stub
return Color.blue;
}
@Override
public void handlePull(Context c) {
// TODO Auto-generated method stub
c.changeState(RedColor.instance());
}
@Override
public void handlepPush(Context c) {
// TODO Auto-generated method stub
c.changeState(GreenColor.instance());
}
public static State instance() {
// TODO Auto-generated method stub
if(blueColor == null)blueColor = new BlueColor();
return blueColor;
}
}
package com.gof.chapter5.state.color; public class Test { public static void main(String[] ben){ Context c = new Context(); System.out.println(c.getColor()); c.handlePull(); System.out.println(c.getColor()); c.handlePull(); System.out.println(c.getColor()); c.handlePull(); System.out.println(c.getColor()); c.handlePull(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); c.handlePush(); System.out.println(c.getColor()); } }