17.(行为型模式)java设计模式之状态模式

一、什么是状态模式(State Pattern)

  • 对象的⾏为依赖于它的状态(属性),并且可以根据它的状态改变⽽改变它的相关⾏为 ,属于⾏为型模式
  • 允许⼀个对象在其内部状态改变时改变它的⾏为
  • 状态模式是策略模式的孪⽣兄弟,它们的UML图是⼀样的,但实际上解决的是不同情况的两种场景问题
  • ⼯作中⽤的不多,基本策略模式⽐较多

二、状态模式的实现方式

模式结构分析:

  • Context 上下⽂: 定义了客户程序需要的接⼝并维护⼀个具体状态⻆⾊的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
  • State 抽象状态类: 定义⼀个接⼝以封装与Context的⼀个特定状态相关的⾏为。
  • ConcreteState具体状态类: 实现抽象状态定义的接⼝。

类关系图:

统一模型:

代码实现:

查看代码

/*
* 状态模式
* */
public interface State {
    void handle();
}
public class SendOrderState implements State{
    @Override
    public void handle() {
        System.out.println("订单已经发货");
        System.out.println("调⽤短信服务,告诉⽤户已经发货");
        System.out.println("更新物流信息\n");
    }
}
public class PayOrderState implements State{
    @Override
    public void handle() {
        System.out.println("新订单已经⽀付");
        System.out.println("调⽤商户客服服务,订单已经⽀付");
        System.out.println("调⽤物流服务,未发货\n");
    }
}
public  class NewOrderState  implements State{
    @Override
    public void handle() {
        System.out.println("新订单,未⽀付");
        System.out.println("调⽤商户客服服务,有新订单\n");
    }
}
public class OrderContext {
    private State state;
    public OrderContext(){}
    public void setState(State state) {
        this.state = state;
        System.out.println("订单状态边更!!");
        this.state.handle();
    }
}

测试用例:

/*
* 状态模式
* */
@Test
public void state(){
    OrderContext orderContext = new OrderContext();
    orderContext.setState(new NewOrderState());
    orderContext.setState(new PayOrderState());
    orderContext.setState(new SendOrderState());
}

测试结果:

订单状态边更!!
新订单,未⽀付
调⽤商户客服服务,有新订单

订单状态边更!!
新订单已经⽀付
调⽤商户客服服务,订单已经⽀付
调⽤物流服务,未发货

订单状态边更!!
订单已经发货
调⽤短信服务,告诉⽤户已经发货
更新物流信息

方法评估:

状态设计和策略模式的区别:

  • UML图⼀样,结构基本类似
  • 状态模式重点在各状态之间的切换,从⽽做不同的事情策略模式更侧重于根据具体情况选择策略,并不涉及切
  • 状态模式不同状态下做的事情不同,⽽策略模式做的都是同⼀件事。例如,聚合⽀付平台,有⽀付宝、微信⽀付、银联⽀付,虽然策略不同,但最终做的事情都是⽀付。
  • 状态模式,各个状态的同⼀⽅法做的是不同的事,不能互相替换换

优点:

  • 只需要改变对象状态即可改变对象的⾏为
  • 可以让多个环境对象共享⼀个状态对象,从⽽减少系统中对象的个数

缺点:

  • 状态模式的使⽤会增加系统类和对象的个数。
  • 状态模式的结构与实现都较为复杂,如果使⽤不当将导致程序结构和代码的混乱
  • 状态模式对“开闭原则”的⽀持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码

三、JAVA知识点

四.汇总

posted @ 2023-01-17 14:32  冰融心  阅读(56)  评论(0编辑  收藏  举报