优点
- 封装转换规则
- 将一个状态相关的操作放在一个类中,Context只需要切换自己的状态就能做相应操作
- 取代if块
- 可以被多个Context共享一个State
缺点
- 不符合开闭原则
- 结构与实现复杂
使用场景
- 行为随状态改变而改变的场景
- 条件、分支语句的代替者
/**
* 角色(Context)
*/
public class Factory {
private State state;
private HashMap<String, State> stateMap;
private int inventory;
public Factory() {
stateMap = new HashMap<>();
OrderState orderState = new OrderState();
ProcessOrderState processOrderState = new ProcessOrderState();
StopOrderState stopOrderState = new StopOrderState();
stateMap.put(orderState.getName(), orderState);
stateMap.put(processOrderState.getName(), processOrderState);
stateMap.put(stopOrderState.getName(), stopOrderState);
setInventory(3);
setState(orderState);
}
public int getInventory() {
return inventory;
}
public void setInventory(int inventory) {
this.inventory = inventory;
}
public State getState(String name) {
return stateMap.get(name);
}
public void setState(State state) {
this.state = state;
}
public void handle(){
this.state.handle(this);
System.out.println("生产厂状态变更,目前为:" + this.state.getName());
}
}
public abstract class State {
protected String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void handle(Factory factory);
}
/**
* 角色(ConcreteState)
*/
public class OrderState extends State{
public OrderState() {
this.setName("接受订单状态");
}
@Override
public void handle(Factory factory) {
System.out.println("正在接受订单......");
if(factory.getInventory() == 0){
System.out.println("暂无库存,目前不接受订单");
factory.setState(factory.getState("不接受订单状态"));
}else {
factory.setInventory(factory.getInventory() - 1);
factory.setState(factory.getState("订单处理状态"));
}
}
}
/**
* 角色(ConcreteState)
*/
public class ProcessOrderState extends State{
public ProcessOrderState() {
this.setName("订单处理状态");
}
@Override
public void handle(Factory factory) {
System.out.println("订单处理中......");
factory.setState(factory.getState("接受订单状态"));
System.out.println("订单处理完成!!!剩余库存:" + factory.getInventory());
if(factory.getInventory() <= 0){
factory.setState(factory.getState("不接受订单状态"));
}
}
}
/**
* 角色(ConcreteState)
*/
public class StopOrderState extends State{
public StopOrderState() {
this.setName("不接受订单状态");
}
@Override
public void handle(Factory factory) {
if(factory.getInventory() > 0){
System.out.println("重新开始接受订单");
factory.setState(factory.getState("接受订单状态"));
}else {
System.out.println("目前不接受订单,请谅解......");
}
}
}
测试类
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
factory.handle();
factory.handle();
factory.handle();
factory.handle();
factory.handle();
factory.handle();
factory.handle();
factory.handle();
factory.handle();
factory.setInventory(3);
factory.handle();
factory.handle();
factory.handle();
}
}
结果