經過好玩又有趣的軟考備戰和考試之後,終究還是要歸於平靜的.我們要學得東西還有很多,於是在軟考結束的第二天,機房合作就馬上提上了議事議程.在剛開始的時候,是一邊做著新聞發布系統,一邊思考合作的事宜,到了後來,逐步的過渡全身心投入機房合作的項目中去的階段,因為我是項目組長,必須要做很多的工作,從一開始的建模到文檔編寫,再到敲代碼,都要涉及,今天我們來討論討論如何在機房收費系統的費用計算上使用職責鏈模式.
首先我們要給出解決方案的類圖
職責鏈模式無非就是把所有的處理對象,通過SetSuccessor()函數連結起來,形成一個處理鏈,當我們將一個問題請求出入時,該請求會沿著職責鏈進行傳遞,知道被處理為止.這就是職責鏈模式的工作流程.
下面我給出機房收費系統關於下機時給出的消費時間,如何計算應收費用的邏輯圖
針對此設計給出一個使用C#編寫的簡單demo如下:
<span style="font-size:18px;">using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{ class Program { static void Main(string[] args) { ConcreteHandler1 handler1= new ConcreteHandler1 ("處理對象1"); ConcreteHandler2 handler2= new ConcreteHandler2 ("處理對象2"); ConcreteHandler3 handler3= new ConcreteHandler3 ("處理對象3"); handler1.SetSuperior(handler2); handler2.SetSuperior(handler3); Request request = new Request(); request.ConsumeTime = 4; handler1.RequestApplications(request); Request request1 = new Request(); request1.ConsumeTime = 20; handler1.RequestApplications(request1); Request request2 = new Request(); request2.ConsumeTime = 50; handler1.RequestApplications(request2); Console.Read(); } } //待處理的對象,即上網時間 class Request { //客戶消費時間 private int consumetime; public int ConsumeTime { get { return consumetime; } set { consumetime = value; } } //客戶消費金額 private double consumecash; public double ConsumeCash { get { return consumecash; } set { consumecash = value ; } } } //處理者抽象類別 abstract class Handler { protected string name; protected Handler superior; public Handler(string name) { this.name = name; } public void SetSuperior(Handler superior) { this.superior = superior; } abstract public void RequestApplications(Request request); } //處理類1 class ConcreteHandler1:Handler { public ConcreteHandler1(string name) : base(name) { } public override void RequestApplications(Request request) { if (request .ConsumeTime <=5 ) { request.ConsumeCash = 0.0; Console.WriteLine("該客戶的消費金額為{0}元,業務員:{1}", request .ConsumeCash ,name ); } else { if (superior != null) superior.RequestApplications(request); } } } //處理類2 class ConcreteHandler2:Handler { public ConcreteHandler2(string name) : base(name) { } public override void RequestApplications(Request request) { if (request .ConsumeTime >5 &&request .ConsumeTime <=30 ) { request.ConsumeCash = 3.0 * (30.0 / 60.0); Console.WriteLine("該客戶的消費金額為{0}元,業務員:{1}",request .ConsumeCash,name ); } else { if (superior != null) superior.RequestApplications(request); } } } //處理類3 class ConcreteHandler3:Handler { public ConcreteHandler3(string name) : base(name) { } public override void RequestApplications(Request request) { if (request.ConsumeTime >30 ) { request.ConsumeCash = 3.0 * ((double )request .ConsumeTime / 60.0); Console.WriteLine("該客戶的消費金額為{0}元,業務員:{1}", request .ConsumeCash,name ); } } }}</span>
運行結果如下
有的人可能覺得職責鏈模式用在此處顯得有些多此一舉,這樣想不無道理,我們在機房收費系統盡量加入設計模式,目的是學習並且對設計模式進行實踐,並不是要給出問題的完美解決方案,因此用的合不合適也就無所謂了,重要的是這學習的過程.