不一样职责链模式(设计模式一)

站长

发表文章数:4343

上周热点回顾(12.9-12.15)

背景

把以前的设计模式整理下,也有一些在工作中对设计模式的体悟。
准备写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; }
    }
}

开发者:

如何正确的探索 Microsoft Ignite The Tour

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的时候,小组长会与客户交流。
什么客户直接满意?为何会有如此问题?
不一样职责链模式(设计模式一)

总结

职责链在日常中还是出现挺多的,用起来感觉解决了不少问题。

阿里云叔同:以容器为代表的云原生技术,已成为释放云价值的最短路径

未经允许不得转载作者:站长, 转载或复制请以 超链接形式 并注明出处 xss云之家,资源网,娱乐网,网络技术资源分享平台
原文地址:《不一样职责链模式(设计模式一)》 发布于2019-12-16

分享到:
赞(0) 打赏 生成海报

长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

投稿赚钱
2020年在家赚取零花钱
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册