Java设计模式设计模式

《设计模式》责任链模式

2019-08-09  本文已影响2人  敏捷Studio

定义

一个请求沿着一条“链”传递,直到该“链”上的某个处理者处理它为止。

介绍

UML类图

责任链模式UML类图

角色说明:

实现

以送快递为例,单个快递员只负责某个片区的快递,若某个快递目的地不属于当前的片区,则交给下一个快递员来处理,直到有人处理为止。

1、创建抽象处理者类。定义处理请求的方法以及持有下一个Handler的引用:

// 快递员抽象类
public abstract class Postman {
  // 下一个快递员
  protected Postman nextPostman;

  // 派送快递
  public abstract void handleCourier(String address);
}

2、创建具体处理者类。实现抽象处理者类中的方法:

// 北京快递员
public class BeiJingPostman extends Postman {
  @Override
  public void handleCourier(String address) {
    if (address.equals("BeiJing")) {
      // 北京地区的则派送
      System.out.println("派送到北京");
      return;
    } else {
      // 否则交给下一个快递员去处理
      nextPostman.handleCourier(address);
    }
  }
}

// 上海快递员
public class ShangHaiPostman extends Postman {
    @Override
    public void handleCourier(String address) {
        if (address.equals("ShangHai")) {
            System.out.println("派送到上海");
            return;
        } else {
            nextPostman.handleCourier(address);
        }
    }
}

// 广州快递员
public class GuangZhouPostman extends Postman {
  @Override
  public void handleCourier(String address) {
    if (address.equals("GuangZhou")) {
      System.out.println("派送到广州");
      return;
    } else {
      if (nextPostman != null) {
        nextPostman.handleCourier(address);
      }
    }
  }
}

3、客户端测试

public void test() {
  // 创建不同的快递员对象
  Postman beiJingPostman = new BeiJingPostman();
  Postman shangHaiPostman = new ShangHaiPostman();
  Postman guangzhouPostman = new GuangZhouPostman();
    
  // 创建下一个结点
  beiJingPostman.nextPostman = shangHaiPostman;
  shangHaiPostman.nextPostman = guangZhouPostman;

  // 处理不同地区的快递,都是从首结点北京快递员开始
  System.out.println("有一个上海快递需要派送:");
  beiJingPostman.handleCourier("Shanghai");
  System.out.println("有一个广州快递需要派送:");
  beiJingPostman.handleCourier("Guangzhou");
  System.out.println("有一个美国快递需要派送:");
  beiJingPostman.handleCourier("America"); 
}

输出结果:

有一个上海快递需要派送:
派送到上海
有一个广州快递需要派送:
派送到广州
有一个美国快递需要派送:

4、说明:

应用场景

优缺点

优点

缺点

Android中的源码分析

上一篇下一篇

猜你喜欢

热点阅读