状态模式
-
定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
-
优点:1) 每个状态都是一个子类,只要增加状态就要增加子类,修改状态,只修改一个子类即可。符合“开闭原则”。容易增删状态。2)结构清晰,避免了过多的switch…case或者if…else语句的使用,避免了程序的复杂性,提高可维护性。
-
缺点:会产生很多类。每个状态都要一个对应的类,当状态过多时会产生很多类,加大维护难度。
-
博客:https://blog.csdn.net/qq_31984879/article/details/85199258?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-1.control&spm=1001.2101.3001.4242
-
实例:购物场景:在购物网站进行购物时,订单会产生几种状况:已下单、已付款、送货中、确定收货等状态。所以系统会判断该订单的状态,不管是哪种状态都应给出对应的操作,这就是状态。
-
类图:
-
代码:
/**
* 状态接口
*/
public interface State {
void handle();
}
/**
* 具体状态角色(ConcreteState):下单状态
*/
public class Booked implements State {
@Override
public void handle() {
System.out.println("您已下单!");
}
}
/**
* 具体状态角色(ConcreteState):支付状态
*/
public class Payed implements State {
@Override
public void handle() {
System.out.println("您已支付订单!");
}
}
/**
* 具体状态角色(ConcreteState):订单发货状态
*/
public class Sended implements State {
@Override
public void handle() {
System.out.println("订单已发货!");
}
}
/**
* 具体状态角色(ConcreteState):订单运送状态
*/
public class InWay implements State {
@Override
public void handle() {
System.out.println("订单正在运送中!");
}
}
/**
* 具体状态角色(ConcreteState):订单签收状态
*/
public class Recieved implements State {
@Override
public void handle() {
System.out.println("订单已签收!");
}
}
/**
* 定义一个环境类来维护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();
}
}
/**
* 测试状态模式
*/
public class TestState {
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());
}
}