作用
- 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
何时使用
- 代码中包含大量与对象状态有关的条件语句。
优点
- 封装了转换规则
- 枚举可能的状态,在枚举状态之前需要确定状态种类
- 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
- 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块
- 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
实例
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/25 15:15
* @Version:
* @Acton: 状态
*/
public interface State {
void handler();
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/25 15:18
* @Version:
* @Acton: 空闲状态
*/
public class FreeStats implements State {
@Override
public void handler() {
System.out.println("房间没人住");
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/25 15:20
* @Version:
* @Acton:
*/
public class BookedStats implements State {
@Override
public void handler() {
System.out.println("房间已预订");
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/25 15:21
* @Version:
* @Acton:
*/
public class CheckedStats implements State {
@Override
public void handler() {
System.out.println("房间已入住,别来烦我");
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/25 15:22
* @Version:
* @Acton:
*/
public class HomeContext {
private State state;
public void setState(State s){
System.out.println("修改状态");
state = s;
state.handler();
}
}
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/9/25 15:25
* @Version:
* @Acton:
*/
public class TestStateDemo {
public static void main(String[] args){
test1();
}
public static void test1(){
HomeContext context = new HomeContext();
context.setState(new FreeStats());
context.setState(new BookedStats());
context.setState(new CheckedStats());
}
}