程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 大話設計模式之職責鏈模式

大話設計模式之職責鏈模式

編輯:C++入門知識

什麼是職責鏈模式?      China  of Responsibility:使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系。將這個對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。       像這種情況在我們身邊隨處可見,比如,班裡想申請一個教室舉辦元旦晚會,文藝委員不能自作主張使用某個教室,於是找到班長,班長要做的就是寫申請,向負責人員申請,負責人批准以後才能使用教室,這一步步的過程就像是一條鏈,從某一點開始執行,不能通過的話就向後走,知道找到某一點能解決了問題才終止。問題只要解決了就達到了目的,不用考慮中間有多少人參與過,也就是只關心結果   此班學生的動機可以表示成如圖:   職責鏈模式結構圖:     角色: Client:客戶端 Handler: 抽象處理者:定義出一個處理請求的接口。如果需要,接口可以定義出一個方法以設定和返回對下家的引用。這個角色通常由一個抽象類或接口實現www.2cto.com ConcreteHandler:具體處理者:具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要具體處理者可以訪問下家 代碼實現: [html]   <span style="font-family:KaiTi_GB2312;font-size:18px;">using System;   using System.Collections.Generic;   using System.Linq;   using System.Text;      namespace 職責鏈模式   {       class Program       {           static void Main(string[] args)           {               //設置職責鏈上家與下家               Handler h1 = new ConcreteHandler1();               Handler h2 = new ConcreteHandler2();               Handler h3 = new ConcreteHandler3();               h1.SetSuccessor(h2);               h2.SetSuccessor(h3);                  int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };               foreach (int request in requests)               {                  //循環給最小處理著提交請求,不同的數據由不同權限處理者處理                   h1.HandleRequest(request);               }               Console.Read();           }       }              //Handler類,定義一個處理請示的接口       abstract class Handler       {           protected Handler successor;              //設置繼任者           public void SetSuccessor(Handler successor)           {               this.successor = successor;           }            //處理請求的抽象方法           public abstract void HandleRequest(int request);       }                            //ConcreteHandler類,具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求就處理它,否則就將該請求轉發給它的後繼者              //ConcreteHandler1類,當請求數在0到10之間則有權處理,否則轉到下一位           class ConcreteHandler1:Handler            {               public override void HandleRequest(int request)               {                   if (request >= 0 && request < 10)                   {                       Console.WriteLine("{0}處理請求{1}", this.GetType ().Name , request);                      }                   else if (successor != null)                   {                       //轉移到下一位                       successor.HandleRequest(request);                                  }               }            }                  //ConcreteHandler2類,當請求數在10到20之間則有權處理,否則轉到下一位              class ConcreteHandler2 : Handler           {               public override void HandleRequest(int request)               {                   if (request >= 10 && request < 20)                   {                       Console.WriteLine("{0}處理請求{1}", this.GetType().Name, request);                   }                   else if (successor != null)                   {                       successor.HandleRequest(request);                   }               }           }             //ConcreteHandler3類,當請求數在20到30之間則有權處理,否則轉到下一位           class ConcreteHandler3 : Handler           {               public override void HandleRequest(int request)               {                   if (request >= 20 && request < 30)                   {                       Console.WriteLine("{0}處理請求{1}", this.GetType().Name, request);                   }                   else if (successor != null)                   {                       successor.HandleRequest(request);                   }               }           }                  }   </span>       運行結果:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved