责任链模式

定义:

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

我们通过一个简单的例子来了解责任链模式

场景:古代女子三从四德,“三从”是指“未嫁从父、既嫁从夫、夫 死从子”。也就是说,一位女性在结婚之前要听从于父亲,结婚之后要听从于丈夫,如果丈夫死了还要听从于儿子。下面我们用程序来展示古代女子请示出门逛街流程。

定义女子抽象类,定义女子当前状态和请示内容

public abstract class IWomen {
  //判断条件
  protected abstract int getType();
  //请示要做什么
  protected abstract String getRequest();
}

实现类

public class Women extends IWomen {

  /** 通过一个int类型的参数来描述妇女的个人状况
   * 1--未出嫁 * 2--出嫁 * 3--夫死
   *
   */
  private int type;
  private String request;

  public Women(int type, String request) {
    this.type = type;
    this.request = request;
  }

  @Override
  protected int getType() {
    return this.type;
  }

  @Override
  protected String getRequest() {
    return this.request;
  }
}

责任链核心抽象类

需要注意的是,在设置下一个责任人的时候使用了递归,因此需要控制责任链长度,否则会影响性能

public abstract class Handler {
  public final static int FATHER_LEVEL_REQUEST = 1;
  public final static int HUSBAND_LEVEL_REQUEST = 2;
  public final static int SON_LEVEL_REQUEST = 3;

  //能处理的级别
  private int level = 0;
  //下一个责任人
  private Handler nextHandler;

  public Handler(int level) {
    this.level = level;
  }

  public void setNextHandler(Handler nextHandler) {
    this.nextHandler = nextHandler;
  }

  public final void handlerMessage(IWomen women) {
    if (women.getType() == this.level) {
      this.response(women);
    } else {
      if (nextHandler != null) {
        this.nextHandler.handlerMessage(women);
      } else {
        // do nothing
      }
    }

  }

  //请示回应
  public abstract void response(IWomen women);
}

实现类

public class Father extends Handler {

  public Father() {
    super(Handler.FATHER_LEVEL_REQUEST);
  }

  @Override
  public void response(IWomen women) {
    System.out.println("-----女儿向父亲请示------");
    System.out.println(women.getRequest());
    System.out.println("父亲的答复是:同意");
  }
}
public class Husband extends Handler {

  public Husband() {
    super(Handler.HUSBAND_LEVEL_REQUEST);
  }

  @Override
  public void response(IWomen women) {
    System.out.println("-----妻子向丈夫请示------");
    System.out.println(women.getRequest());
    System.out.println("丈夫的答复是:同意");
  }
}
public class Son extends Handler {

  public Son() {
    super(Handler.SON_LEVEL_REQUEST);
  }

  @Override
  public void response(IWomen women) {
    System.out.println("-----母亲向儿子请示------");
    System.out.println(women.getRequest());
    System.out.println("儿子的答复是:同意");
  }
}

客户端

public class Client {

  public static void main(String[] args) {

    Random random = new Random();
    List<IWomen> womenList = new ArrayList<IWomen>();
    for (int i = 0; i < 5; i++) {
      womenList.add(new Women(random.nextInt(4), "我要出去逛街"));
    }

    Father father = new Father();
    Husband husband = new Husband();
    Son son = new Son();
    //设置责任链顺序
    father.setNextHandler(husband);
    husband.setNextHandler(son);

    womenList.stream().forEach(e-> father.handlerMessage(e));

  }
}

运行结果

-----女儿向父亲请示------
我要出去逛街
父亲的答复是:同意
-----妻子向丈夫请示------
我要出去逛街
丈夫的答复是:同意
-----母亲向儿子请示------
我要出去逛街
儿子的答复是:同意
-----妻子向丈夫请示------
我要出去逛街
丈夫的答复是:同意
posted @ 2021-08-30 14:43  hejiancao  阅读(84)  评论(0)    收藏  举报