不一樣職責鏈模式(設計模式一)
阿新 • • 發佈:2019-12-16
背景
把以前的設計模式整理下,也有一些在工作中對設計模式的體悟。
準備寫24篇吧,化名為二十四章經,第一章打算寫職責鏈模式,也就是這一篇,是因為工作中除了單例用的最多的就是職責鏈了。
下面的例子,比市面的介紹類的複雜一些吧,還是可以交流交流的。話不多說,開工吧。
作用
有些人喜歡針對設計模式去探討優缺點,設計模式本身是非常完善的,更多的是一種解決方案,也就是隻有合不合適這個概念。
作用:可以讓對一個物件進行單一方向傳遞性處理。
例子
對於職責,公司的職責是個很好的例子。比如說軟體公司師A,做完了專案,交給小組長稽核,小組長給了客戶看,客戶不滿意,然後通知給小組長,小組長又通知開發人員A。
public abstract class handle { //角色 public string role; // 責任人狀態 public int state; // 下一個責任者 protected handle nextHandle; //上一個責任者 protected handle preHandle; public handle(string role) { this.role = role; } //設定下一個責任者 public void SetNextHandle(handle nextHandle) { this.nextHandle = nextHandle; } //傳送請求 public void SendRequest(handle handler,RequestMessage request) { this.preHandle = handler; if (IsSendRequest(request)) { if (nextHandle != null) { nextHandle.SendRequest(this, request); } } else { SendResponse(request); } } // 處理回覆請求 public void SendResponse(RequestMessage request) { if (IsSendResponse(request)) { if (preHandle != null) { preHandle.SendResponse(request); } } } // 是否傳送請求 protected abstract bool IsSendResponse(RequestMessage request); // 是否繼續向下傳遞請求 protected abstract bool IsSendRequest(RequestMessage request); }
這是一個很簡單的抽象類,其中我實現了兩個方法:
- SendRequest 用來判斷是否傳遞給下一個責任者
- SendResponse 用來判斷是否傳遞迴責任者
在這裡我加入了責任人狀態是為了方便演示。
下面是請求的RequestMessage,也就是要給客戶的資料模板。
public class RequestMessage { //專案名 private string name; //內容 private string content; //符合客戶的程度 private ushort grade; public string Name { get { return name; } set { name = value; } } public string Content { get { return content; } set { content= value; } } public ushort Grade { get { return grade; } set { grade = value; } } }
開發者:
public class developer : handle { public developer():base("軟體工程師") { } protected override bool IsSendRequest(RequestMessage request) { return true; } protected override bool IsSendResponse(RequestMessage request) { //fix bug 客戶不滿意苦逼改程式碼 System.Console.WriteLine("苦逼優化"); return false; } }
在軟體開發工程師角色中,IsSendRequest無論如何都為true,不可能自我認可,然後就ok的。
public class Manager : handle
{
public Manager() : base("小組長")
{
}
protected override bool IsSendRequest(RequestMessage request)
{
if (request.Grade >= 8)
{
return true;
}
else
{
return false;
}
}
protected override bool IsSendResponse(RequestMessage request)
{
if (request.Grade > 6)
{
System.Console.Write("客戶溝通一下");
return false;
}
else
{
return true;
}
}
}
在小組長角色中,如果開發到了8分直接給客戶,如果每到8分,到了6分,和客戶商量,如果6分不到直接讓程式設計師改程式碼。
public class Client : handle
{
public int Grade;
public Client(int Grade) : base("客戶")
{
this.Grade = Grade;
}
protected override bool IsSendRequest(RequestMessage request)
{
return false;
}
protected override bool IsSendResponse(RequestMessage request)
{
if (request.Grade * 0.8 >= Grade)
{
return false;
}
else
{
request.Grade = (unshort)(request.Grade * 0.8);
}
return true;
}
}
在客戶角色中假設客戶評分,是軟體開發人員的0.8,然後如果大於客戶心中的評分就過,小於就打回,並把自己的評分發送回去。
執行程式碼如下:
static void Main(string[] args)
{
developer developerA = new developer();
Manager managerB = new Manager();
Client clientC = new Client(9);
developerA.SetNextHandle(managerB);
managerB.SetNextHandle(clientC);
RequestMessage requestMessage = new RequestMessage();
requestMessage.Name = "某某專案";
requestMessage.Content = "某功能ok";
requestMessage.Grade = 8;//自我評分8分
// 傳送這個請求
developerA.SendRequest(developerA, requestMessage);
}
得到的結果是重新優化程式碼,當軟體工程師自我評分為10的時候,客戶評分還是9的時候,小組長會與客戶交流。
什麼客戶直接滿意?為何會有如此問題?
總結
職責鏈在日常中還是出現挺多的,用起來感覺解決了不少問題