国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

責任鏈模式(Chain of Responsibility)

2019-11-18 12:15:46
字體:
來源:轉載
供稿:網友

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

  我們可以定義不同的類,來對應上面列表中的不同治理層次。
  Listing 21.1: Classes Representing Different Management Levels
  
  class BranchManager {
  static double LIMIT = 25000;
  …
  …
  }//End of class
  class RegionalDirector {
  static double LIMIT = 100000;
  …
  …
  }//End of class
  class VicePresident {
  static double LIMIT = 200000;
  …
  …
  }//End of class
  class PresidentCOO {
  static double LIMIT = 400000;
  …
  …
  }//End of class
  
  讓我們定義一個PurchaseRequest類,它代表購買請求。
  
  PurchaseRequest
  ID:int
  description:String
  amount:double
  getAmount():double
  
 責任鏈模式(Chain of Responsibility)(圖二)

  Figure 21.1: PurchaseRequest Class Representation
  
  Listing 21.2: 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 21.3: 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;
  };
  }
  
 責任鏈模式(Chain of Responsibility)(圖三)

  Figure 21.2: Purchase Request Approver Hierarchy
  
  現在,每一個授權者被重新定義為抽象類PRHandler的子類。每一個授權對象把購買請求的金額和它所在的治理層次所授權的金額進行比較,假如請求的金額小于授權的金額,它就可以授權購買,假如大于,它傳遞購買請求到鏈表中的下一個授權者。
  
  Listing 21.4: PRHandler Concrete Subclasses
  
  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
  
  為了授權購買請求,客戶端需要:
  
  (1)  創建一個可能接受購買請求的授權對象集合,把他們按照授權金額升序進行排列,使用setNextHandler(PRHandler)方法,連接每一個授權者。下面是可能的授權購買請求的授權鏈表:
  
 責任鏈模式(Chain of Responsibility)(圖四)

  Figure 21

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 建湖县| 志丹县| 襄垣县| 邮箱| 内江市| 喀喇沁旗| 永康市| 合阳县| 永顺县| 晋江市| 石嘴山市| 吉林省| 益阳市| 乃东县| 长兴县| 普定县| 勐海县| 东乡| 大名县| 荣成市| 锦州市| 屏东市| 留坝县| 永新县| 达拉特旗| 辛集市| 景谷| 兴化市| 松潘县| 宁波市| 墨玉县| 介休市| 平山县| 澜沧| 灌南县| 庐江县| 盐池县| 肇庆市| 扬州市| 五河县| 清远市|