1. 程式人生 > >不一樣職責鏈模式(設計模式一)

不一樣職責鏈模式(設計模式一)

背景

把以前的設計模式整理下,也有一些在工作中對設計模式的體悟。
準備寫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); 
}

這是一個很簡單的抽象類,其中我實現了兩個方法:

  1. SendRequest 用來判斷是否傳遞給下一個責任者
  2. 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的時候,小組長會與客戶交流。
什麼客戶直接滿意?為何會有如此問題?

總結

職責鏈在日常中還是出現挺多的,用起來感覺解決了不少問題