状态模式与责任链模式

一、状态模式

状态模式定义:当一个对象的内在状态改变时允许其改变行为,这个对象看起来像是改变了其类。也就是说类中的状态改变了,再调用类的方法得到的结果会有所不同

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,状态之间的转换在各个状态类中,可以把复杂的逻辑简化。

在这里插入图片描述
State抽象状态类:

public abstract class State{

  public abstract void handle(Context context);
  
}

Context类,维护了一个State类型的对象,这个对象就是当前的状态:

public class Context{

  private State state;
  // 状态切换的参照
  private int hour;
  
  public Context(){
    // 状态初始化为ConcreteStateA
    this.state = new ConcreteStateA();
  }

  public void setState(State state){
    this.state = state;
    
    System.out.println("当前状态:" + state.getClass().getClassName());
  }

  public State getState(){
    return this.state;
  }    

  public void request(){
    state.handle(this);
  }  

ConcreteState具体状态类:

public ConcreteStateA{

  @Override
  public void handle(Context context){
    if(context.getHour() < 12){
      System.out.println("状态A");
    } else {
    // 切换到状态B
    context.setState(new ConcreteStateB());
    context.request();
    }
  }
  
}

public ConcreteStateB{

  @Override
  public void handle(Context context){
    if(context.getHour() >= 12){
      System.out.println("状态B");
    } else {
    // 切换到状态A
    context.setState(new ConcreteStateA());
    context.request();
    }
  }
  
}

效果测试类:

public class Test{
   public static void main(String[] args) {
        Context context = new Context();
        context.setHour(19);
        context.request();
        context.setHour(9);
        context.request();
    }
}

输出:
状态B
状态A

二、责任链模式

责任链模式定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并将请求沿着这条链传递,直到有一个对象处理它为止。

在这里插入图片描述
Handler类,请求处理抽象类:

public abstract class Handler {
    /** 责任链中的下一个处理者 */
    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    /** 处理请求的抽象方法 */
    public abstract void handle(int request);
}

ConcreteHandler,具体请求处理类

public class ConcreteHandlerA extends Handler{
    @Override
    public void handle(int request) {
        if(request >= 0 && request < 10){
            System.out.println("ConcreteHandlerA处理请求 " + request);
        } else if(successor != null){
            // 不属于本处理器处理,将请求传递给下一个处理器处理
            successor.handle(request);
        }
    }
}

public class ConcreteHandlerB  extends Handler{
    @Override
    public void handle(int request) {
        if(request >= 10 && request < 20){
            System.out.println("ConcreteHandlerB处理请求 " + request);
        } else if(successor != null){
            // 不属于本处理器处理,将请求传递给下一个处理器处理
            successor.handle(request);
        }
    }
}

public class ConcreteHandlerC extends Handler{
    @Override
    public void handle(int request) {
        if(request >= 20){
            System.out.println("ConcreteHandlerC处理请求 " + request);
        } else if(successor != null){
            // 不属于本处理器处理,将请求传递给下一个处理器处理
            successor.handle(request);
        }
    }
}

ResponsibilityLinkTest,效果演示测试类

public class ResponsibilityLinkTest {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        // 将请求处理对象形成链
        handlerA.setSuccessor(handlerB);
        handlerB.setSuccessor(handlerC);

        handlerA.handle(12);
        handlerA.handle(222);
    }
}

输出:
ConcreteHandlerB处理请求 12
ConcreteHandlerC处理请求 222

三、状态模式与责任链模式对比

状态模式与责任链模式都存在请求的传递处理,不同的是状态模式通过状态切换来使不同的状态处理类处理请求,而责任链模式直接传递给下一个请求处理类。
状态类中除明确自己在某个状态下的操作外,还要明确如何切换到其他状态

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值