您的位置:首页 > 其它

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

2017-11-27 18:56 309 查看

1-定义

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

2-结构

State(interface)状态接口

Concrete State:具体状态

Context:实例中的GumballMachine,持有各种状态的实例。

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是给一个对象封装好的算法族(行为),可以更改算法族(行为)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式