java软件体系结构设计模式------责任链

说明:

责任链(CoR)模式建议在发出请求的对象和该请求的潜在处理对象集之间建立一种低耦合的关联关系


CoR模式的一些重要特性:
a,处理客户请求的潜在对象集以及它们构成链条的顺序都可以有客户对象在运行时期动态地决定,决定的因素取决于应用的当前状态


b,根据其当前状态,一个客户可以拥有不同的处理对象集来处理不同类型的请求。


c,对请求进行初始化的客户对象或者将请求转发给下一个对象的任何一个潜在处理对象都不必知道知道接受请求的对象的能力。


d,不能保证请求一定能得到处理


实例:

它模拟一家典型的组织中对购买请求进行核准的过程:


代码:

public abstract class PRHandler {
  private PRHandler nextHandler;
  private String handlerName;


  public PRHandler(String name) {
    handlerName = name;
  }
  public String getName() {
    return handlerName;
  }
  public abstract boolean authorize(PurchaseRequest request);
  public PRHandler getNextHandler() {
    return nextHandler;
  }
  public void setNextHandler(PRHandler handler) {
    nextHandler = handler;
  };
}
class BranchManager extends PRHandler {
  static double LIMIT = 25000;


  public BranchManager(String name) {
    super(name);
  }
  public boolean authorize(PurchaseRequest request) {
    double amount = request.getAmount();


    if (amount <= LIMIT) {
      System.out.println(" Branch Manager " + getName() +
                         " has authorized the PR - " + request);
      return true;
    } else {
      //forward the request to the next handler
      return getNextHandler().authorize(request);
    }
  }


} // End of class


class RegionalDirector extends PRHandler {
  static double LIMIT = 100000;


  public RegionalDirector(String name) {
    super(name);
  }


  public boolean authorize(PurchaseRequest request) {
    double amount = request.getAmount();


    if (amount <= LIMIT) {
      System.out.println(" Regional Director " + getName() + 
                         " has authorized the PR - " +
                         request);
      return true;
    } else {
      //forward the request to the next handler
      return getNextHandler().authorize(request);
    }
  }


} // End of class


class VicePresident extends PRHandler {
  static double LIMIT = 200000;


  public VicePresident(String name) {
    super(name);
  }


  public boolean authorize(PurchaseRequest request) {
    double amount = request.getAmount();


    if (amount <= LIMIT) {
      System.out.println(" V.P. " + getName() +
                         " has authorized the PR - " + request);
      return true;
    } else {
      //forward the request to the next handler
      return getNextHandler().authorize(request);
    }
  }


} // End of class


class PresidentCOO extends PRHandler {
  static double LIMIT = 400000;


  public PresidentCOO(String name) {
    super(name);
  }


  public boolean authorize(PurchaseRequest request) {
    double amount = request.getAmount();


    if (amount <= LIMIT) {
      System.out.println(" President & COO " + getName() +
                         " has authorized the PR - " + request);
      return true;
    } else {
      System.out.println("PR - " + request +
                         " couldn't be authorized.\n " +
                         "Executive Board needs to be " +
                         "consulted for approval \n" +
                         "reason: Amount too large");
      return false;
    }
  }


} // End of class


public class PRManager {


  private BranchManager branchManager;
  private RegionalDirector regionalDirector;
  private VicePresident vicePresident;
  private PresidentCOO coo;


  public static void main(String[] args) {
    PRManager manager = new PRManager();
    manager.createAuthorizationFlow();


    PurchaseRequest request =
      new PurchaseRequest(1, "Office Supplies",10000);
    manager.branchManager.authorize(request);


    request = new PurchaseRequest(2, "HardWare Procurement",
              175000);
    manager.branchManager.authorize(request);
    request = new PurchaseRequest(3, "AD Campaign",800000);
    manager.branchManager.authorize(request);


  }


  public void createAuthorizationFlow() {
    branchManager = new BranchManager("Robin");
    regionalDirector = new RegionalDirector("Oscar");
    vicePresident = new VicePresident("Kate");
    coo = new PresidentCOO("Drew");


    branchManager.setNextHandler(regionalDirector);
    regionalDirector.setNextHandler(vicePresident);
    vicePresident.setNextHandler(coo);
  }


} // End of class


class PurchaseRequest {


  private int ID;
  private String description;
  private double amount;


  public PurchaseRequest(int id, String desc, double amt) {
    ID = id;
    description = desc;
    amount = amt;
  }


  public double getAmount() {
    return amount;
  }


  public String toString() {
    return ID + ":" + description;
  }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值