熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

責任鏈模式(Chain of Responsibility)

2013-11-23 19:47:12  來源: Java高級技術 

  描述
  
  責任鏈模式(CoR)建議發出請求的對象與可能處理這個請求的對象集合之間是低耦合的(set of potential request handler objects)
  
  在有不止一個對象可以處理或實現(fulfill)客戶請求的時候責任鏈模式(CoR)認為順序地給每一個對象一次處理請求的機會在這種情況下應用責任鏈模式(CoR)把每一個可能處理請求的對象以鏈表的形式組織起來在鏈表中每一個對象有一個指向下一個對象的指針(Pointer)在鏈表中的第一個對象接受請求並且決定是否處理它或者把它傳遞
  
  給下一個對象請求一個接一個地遍歷(flow through)鏈表中的所有對象直到請求被其中的一個對象處理或者因到達鏈表尾而沒有被處理
  
  例如如果A?〉B?〉C都可以處理請求按照這個順序A處理請求或者在不知B是否可以處理這個請求的情況下遞給B接受到請求的B可以處理這個請求或者傳遞給C
  
  當C收到請求時這個請求可以被C處理或者沒有經過任何處理而結束換句話說提交的處理鏈表中的請求在到達鏈表尾前可以不被任何處理
  
  下面是責任鏈模式(CoR)一些重要的特征
  
  ()  可能處理請求的對象集合(set of potential request handler objects)以及它們在鏈表中的順序是由客戶端根據現應用的狀態在運行時動態決定的
  
  ()  客戶端根據現在的狀態對於不同的請求類型可以擁有不同的可能處理請求的對象集合(set of potential request handler objects)一個處理請求的對象也可以根據客戶應用的狀態和請求類型把請求傳遞給不同的處理對象為了使這些交互簡單所有的可能處理請求的對象應提供一致的接口在JAVA中不同處理對象可以實現一個共同的接口或者繼承同一個抽象的父類來實現
  
  ()  客戶對象初始化請求或者在不知道這些對象是否能處理這個請求的情況下初始化任何可能處理請求的對象也就是說客戶對象和在處理鏈表中的處理對象都不需要知道到底哪個對象去處理這個請求
  
  ()  請求不能保證被處理也就是在沒有處理的情況下請求已經到達了處理鏈表尾下面的這個情景展示了一個購買請求傳遞到處理鏈表中但是在到達鏈表尾時並沒有被接受
  
  例子
  
  讓我們模擬一個在特定組織裡的購買請求(PR)授權過程的應用通常在確立訂單並發到賣方前一個購買請求是需要不同的管理代表授權的我們假定一個組織中在購買請求金額限制上分為四個授權管理層次如下面的列表
  
  Table : Levels of PR Authorization
  Management Level   Authorization Limit
  Branch Manager  $
  Regional Director  $
  Vice President  $
  President and COO  $
  
 

  我們可以定義不同的類來對應上面列表中的不同管理層次
  Listing : Classes Representing Different Management Levels
  
  class BranchManager {
  static double LIMIT = ;
  …
  …
  }//End of class
  class RegionalDirector {
  static double LIMIT = ;
  …
  …
  }//End of class
  class VicePresident {
  static double LIMIT = ;
  …
  …
  }//End of class
  class PresidentCOO {
  static double LIMIT = ;
  …
  …
  }//End of class
  
  讓我們定義一個PurchaseRequest類它代表購買請求
  
  PurchaseRequest
  ID:int
  description:String
  amount:double
  getAmount():double
  
 

  Figure : PurchaseRequest Class Representation
  
  Listing : PurchaseRequest 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;
  }
  }
  
  一個給定的購買請求(PR)被上面的管理代表所授權或處理換句話說代表不同管理層次的四個類都是處理給定購買請求的可能處理者(授權者)因此不建議PurchaseRequest實例榜定到任何的一個授權者通過使用責任鏈模式(CoR)實現了PurchaseRequest對象和可能授權請求的對象集合之間關聯的低耦合
  
  利用責任鏈模式(CoR)讓我們定義一個抽象類PRHandler它定義這些可能授權購買請求對象的統一接口
  
  Listing : Abstract PRHandler Class
  
  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;
  };
  }
  
 

  Figure : Purchase Request Approver Hierarchy
  
  現在每一個授權者被重新定義為抽象類PRHandler的子類每一個授權對象把購買請求的金額和它所在的管理層次所授權的金額進行比較如果請求的金額小於授權的金額它就可以授權購買如果大於它傳遞購買請求到鏈表中的下一個授權者
  
  Listing : PRHandler Concrete Subclasses
  
  class BranchManager extends PRHandler {
  static double LIMIT = ;
  public BranchManager(String name) {
  super(name);
  }
  public boolean authorize(PurchaseRequest request) {
  double amount = requestgetAmount();
  if (amount <= LIMIT) {
  Systemoutprintln( 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 = ;
  public RegionalDirector(String name) {
  super(name);
  }
  public boolean authorize(PurchaseRequest request) {
  double amount = requestgetAmount();
  if (amount <= LIMIT) {
  Systemoutprintln( 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 = ;
  public VicePresident(String name) {
  super(name);
  }
  public boolean authorize(PurchaseRequest request) {
  double amount = requestgetAmount();
  if (amount <= LIMIT) {
  Systemoutprintln( VP + 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 = ;
  public PresidentCOO(String name) {
  super(name);
  }
  public boolean authorize(PurchaseRequest request) {
  double amount = requestgetAmount();
  if (amount <= LIMIT) {
  Systemoutprintln( President & COO + getName() +
   has authorized the PR ? + request);
  return true;
  } else {
  Systemoutprintln(PR ? + request +
   couldnt be authorized\n +
  Executive Board needs to be +
  consulted for approval \n +
  reason: Amount too large);
  return false;
  }
  }
  }//End of class
  
  為了授權購買請求客戶端需要
  
  ()  創建一個可能接受購買請求的授權對象集合把他們按照授權金額升序進行排列使用setNextHandler(PRHandler)方法連接每一個授權者下面是可能的授權購買請求的授權鏈表:
  
 

  Figure
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27453.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.