状态模式-《Head First 设计模式》

来源:互联网 发布:淘宝怎么查看快递公司 编辑:程序博客网 时间:2024/05/16 17:23

1-定义

允许一个对象在内部状态改变时改变自己的行为。这个对象就像是改变了他的类。

2-结构

  1. State(interface)状态接口
  2. Concrete State:具体状态
  3. Context:实例中的GumballMachine,持有各种状态的实例。
  4. context中调用state.handle():进行处理,在不同状态下做不同工作。

3-实例:

1-State和具体状态

public interface State {    public void insertQuarrer();    public void ejectQuarter();    public void turnCrank();    public void dispense();}

四种状态类:继承State

public class HasQuarterState implements State{    @Override    public void insertQuarrer() {        System.out.println("HasQuarterState-insertQuarrer ");    }    @Override    public void ejectQuarter() {        System.out.println("HasQuarterState-ejectQuarter ");    }    @Override    public void turnCrank() {        System.out.println("HasQuarterState-turnCrank ");    }    @Override    public void dispense() {        System.out.println("HasQuarterState-dispense ");    }}public class NoQuarterState implements State{    @Override    public void insertQuarrer() {        System.out.println("NoQuarterState-insertQuarrer ");    }    @Override    public void ejectQuarter() {        System.out.println("NoQuarterState-ejectQuarter ");    }    @Override    public void turnCrank() {        System.out.println("NoQuarterState-turnCrank ");    }    @Override    public void dispense() {        System.out.println("NoQuarterState-dispense ");    }}public class SoldOutState implements State{    @Override    public void insertQuarrer() {        System.out.println("SoldOutState-insertQuarrer ");    }    @Override    public void ejectQuarter() {        System.out.println("SoldOutState-ejectQuarter ");    }    @Override    public void turnCrank() {        System.out.println("SoldOutState-turnCrank ");    }    @Override    public void dispense() {        System.out.println("SoldOutState-dispense ");    }}public class SoldState implements State{    @Override    public void insertQuarrer() {        System.out.println("SoldState-insertQuarrer ");    }    @Override    public void ejectQuarter() {        System.out.println("SoldState-ejectQuarter ");    }    @Override    public void turnCrank() {        System.out.println("SoldState-turnCrank ");    }    @Override    public void dispense() {        System.out.println("SoldState-dispense ");    }}

2-Context:GumballMachine

拥有对象的实例,进行操作,根据状态产生了不同行为。

public class GumballMachine {    State state;    public GumballMachine() {        state = new SoldOutState();    }    public void insertQuarter() {        state.insertQuarrer();    }    public void ejectQuarter() {        state.ejectQuarter();    }    public void turnCrank() {        state.turnCrank();        state.dispense();    }    public void setState(State state) {        this.state = state;    }}

3-测试

不同的状态,同样的操作却产生了状态相关的行为。

GumballMachine gumballMachine = new GumballMachine();gumballMachine.setState(new SoldOutState());gumballMachine.insertQuarter();gumballMachine.turnCrank();gumballMachine.setState(new NoQuarterState());gumballMachine.ejectQuarter();gumballMachine.turnCrank();

4-State状态模式和Strategy策略模式的异同

1-相同

结构类似

2-不同

  • State状态模式是一个对象的状态改变后,会改变自身的行为
  • Strategy是给一个对象封装好的算法族(行为),可以更改算法族(行为)
原创粉丝点击