参考博客
设计模式之状态模式(State)
状态模式
类型:行为型
一个拥有状态的context对象,在不同的状态下,其行为会发生改变。
角色
- 环境角色(Context):客户程序需要的接口,并且维护一个具体状态的实例,这个实例决定当前状态。
- 状态角色(State):定义一个接口以封装与使用环境角色的一个特定状态的相关行为。
- 具体状态角色(ConcreteState):实现状态角色定义的接口,结构十分简单与策略模式相似。
UML
包结构
state
基类
package 状态模式.state;
public interface State {
void handle();
}
子类
都类似
package 状态模式.state;
public class Sended implements State {
@Override
public void handle() {
System.out.println("已发货!");
}
}
-------------------------------------------
package 状态模式.state;
public class Recieved implements State {
@Override
public void handle() {
System.out.println("已确认收获!");
}
}
context(环境)
package 状态模式.context;
import 状态模式.state.State;
public class Context {
private State state;
public Context() {}
public Context(State state) {
this.state = state;
}
public void setState(State state) {
System.out.println("订单信息已更新!");
this.state = state;
this.state.handle();
}
}
client
package 状态模式.client;
import 状态模式.context.Context;
import 状态模式.state.*;
public class Client {
public static void main(String [] args) {
Context context = new Context();
context.setState(new Booked());
context.setState(new Payed());
context.setState(new Sended());
context.setState(new InWay());
context.setState(new Recieved());
}
}
优点
- 应用状态模式使程序扩展起来变的简单
- 避免了多重条件语句的应用
- 程序结构会变得比较清晰
缺点
- 应用状态模式使类变的过多,而且简单的关系会变的理解困难
- 没有很好的遵守开闭原则,引入新的新的状态会导致原有状态的修改
- 没有很好的处理耦合关系,从例子中可以看出,应用状态模式不仅会使状态类和环境类进行关联而且状态类之间也有关系存在