七、状态模式

1 状态模式应用?

  一个对象存在多种状态的转化,适合用状态模式,把状态转换的复杂逻辑变换转换到具体类中,一个状态对应着一个具体类。

2 状态模式的优缺点?

  优点:把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑判断简化。

                 状态之间实现解耦,方便扩展更多的状态。

  缺点:每增加一个状态,就要增加一个具体状态类。导致较多的ConcreteState子类

                 当状态改变不规律时候,改动大。(比如原来的状态是A--B--C--D),需要一个新状态,并且状态切换为A--E--C--B--D,修改较多。

       每次在具体类中实现状态切换的时候,都要new 一个新的状态。

3 demo(以一个灯的开关状态切换为例,参考:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html)

package com.biao.state.againchange.again;

public class Demo {
    public static void main(String[] args) {
        Light light = new Light(new OffState());
        light.changeState();
        light.changeState();
        light.changeState();
        light.changeState();
    }
}

/*具体类,灯泡,灯泡要注入状态*/
class Light{
    private State state;
    public State getState() {
        return state;
    }
    public void setState(State state) {
        this.state = state;
    }
    public Light(State state) {
        this.state  = state;
    }
    
    public void changeState(){
        if(state != null){
            state.changeState(this);
        }
    }
}
/*抽象出一个状态类*/
abstract class State{//修改灯的状态,所以要通过参数注入一个灯的引用
    abstract void changeState(Light light);
}

/*具体的状态类,该类中要实现灯状态的切换*/
class OnState extends State{
    @Override
    void changeState(Light light) {
        // TODO Auto-generated method stub
        System.out.println("灯关闭了");
        light.setState(new OffState());
    }
}
/*具体的状态类,该类中要实现灯状态的切换*/
class OffState extends State{
    @Override
    void changeState(Light light) {
        // TODO Auto-generated method stub
        System.out.println("灯打开了");
        light.setState(new OnState());
    }
}

 

posted @ 2017-09-27 20:07  国境之南时代  阅读(162)  评论(0编辑  收藏  举报