麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

設計模式(19)---職責鏈模式

2019-11-14 16:17:50
字體:
來源:轉載
供稿:網友

一、定義

職責鏈模式:使得多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系。將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。

解釋:簡單來說應該是對于一個請求,不同的人根據自己職責范圍對它進行處理,同時也因為它一般是從底層向上層傳遞的請求的,所以將處理該請求的不同的對象比喻成一個鏈,從相對“低”的地方傳遞到相對“高”的地方,從而完成請求操作。

 

二、UML類圖及基本代碼

基本代碼:

abstract class Handler    {        PRotected Handler successor;        public void SetSuccessor(Handler successor)        {            this.successor = successor;        }        public abstract void HandleRequest(int request);    }    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);            }        }    }    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);            }        }    }    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);            }        }    }

 

客戶端調用及其結果:

Handler h1 = new ConcreteHandler1();            Handler h2 = new ConcreteHandler2();            Handler h3 = new ConcreteHandler3();            h1.SetSuccessor(h2);            h2.SetSuccessor(h3);            int[] requests = { 6, 5, 14, 23, 18, 9, 17, 6, 26 };            foreach (int request in requests)            {                h1.HandleRequest(request);            }
View Code

 

三、具體實例

列舉一個能更加說明職責鏈的實例。john在單位,向領導請假,小于等于2天經理有權利批準,小于等于5天總監有權利批準,其他的則要交到總經理那里批準。具體代碼如下:

class Request    {        public string RequestType{get;set;}        public string RequestContent{get;set;}        public int Number{get;set;}    }    abstract class Manager    {        protected string name;        protected Manager superior;        public Manager(string name)        {            this.name = name;        }        public void SetSuperior(Manager superior)        {            this.superior = superior;        }        public abstract void Requestapplications(Request request);    }    class CommonManager : Manager    {        public CommonManager(string name)            : base(name)        { }        public override void RequestApplications(Request request)        {            if (request.RequestType == "leave" && request.Number <= 2)            {                Console.WriteLine("{0}:{1} number is {2} ok", name, request.RequestContent, request.Number);            }            else            {                if (superior != null)                {                    superior.RequestApplications(request);                }            }        }    }    class Majordome : Manager    {        public Majordome(string name)            : base(name)        { }        public override void RequestApplications(Request request)        {            if (request.RequestType == "leave" && request.Number <= 5)            {                Console.WriteLine("{0}:{1} number is {2} ok", name, request.RequestContent, request.Number);            }            else            {                if (superior != null)                {                    superior.RequestApplications(request);                }            }        }    }    class GeneralManager : Manager    {        public GeneralManager(string name)            : base(name)        { }        public override void RequestApplications(Request request)        {            if (request.RequestType == "leave")            {                Console.WriteLine("{0}:{1} number is {2} ok", name, request.RequestContent, request.Number);            }            else if (request.RequestType == "add money" && request.Number <= 500)            {                Console.WriteLine("{0}:{1} number is {2} ok", name, request.RequestContent, request.Number);            }            else if (request.RequestType == "add money" && request.Number > 500)            {                Console.WriteLine("{0}:{1} number is {2} not ok", name, request.RequestContent, request.Number);            }        }    }
View Code

 

客戶端調用及結果:

CommonManager jinli = new CommonManager("經理");            Majordome zongjian = new Majordome("總監");            GeneralManager zhongjingli = new GeneralManager("總經理");            jinli.SetSuperior(zongjian);            zongjian.SetSuperior(zhongjingli);            Request request = new Request();            request.RequestType = "leave";            request.RequestContent = "john ask for days";            request.Number = 2;            jinli.RequestApplications(request);            Request request2 = new Request();            request2.RequestType = "leave";            request2.RequestContent = "john ask for days";            request2.Number = 5;            jinli.RequestApplications(request2);
View Code

 

四、優缺點及適用場景

優點:

1)降低了請求發送者和處理者之間的耦合。

2)把多個條件判定分散到各個處理類中,使得代碼更加清晰,責任更加明確。

缺點:

1)在找到正確的處理對象之前,所有的條件判定都要執行一遍,當職責鏈過長時,可能會引起性能問題。

2)可能導致某個請求不被處理。

 

適用場景:

1)一個系統的請求需要多個對象進行審批才能完成的情況。

2)代碼中有多個if-else時,也可以考慮使用職責鏈模式對代碼進行重構。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九九午夜| 手机免费看一级片 | 99国产精品国产免费观看 | 成人男男视频拍拍拍在线观看 | 日日噜噜噜噜久久久精品毛片 | 久久久看 | 99精品国产一区二区三区 | 成人性生活视频在线观看 | 一区二区三区视频在线观看 | 27xxoo无遮挡动态视频 | 国产91亚洲精品一区二区三区 | 中文字幕极速在线观看 | 视频h在线 | 成年人视频在线免费观看 | va毛片 | 久久精品黄 | 天天操综| 成人免费一区二区三区在线观看 | 91久久久久久久久久久久久久 | 国产精品一区2区3区 | 麻豆视频观看 | 国产午夜精品一区 | 羞羞视频免费入口网站 | 国产1区2区3区中文字幕 | 我爱我色成人网 | 一级做受毛片免费大片 | 中文字幕精品在线观看 | 成人免费av在线 | 国产亚洲精品久久久久久久久久 | 久久精品之 | 成人黄视频在线观看 | 深夜免费观看视频 | 美女视频大全网站免费 | 免费国产在线精品 | gril hd| 韩国十九禁高潮床戏在线观看 | www.777含羞草| 免费91在线 | 精品中文字幕久久久久四十五十骆 | 久久久久久久久久亚洲精品 | 青草久久av |