美文网首页Unity Come On
Unity【话大】设计模式之责任链模式

Unity【话大】设计模式之责任链模式

作者: su9257_海澜 | 来源:发表于2019-02-02 12:21 被阅读86次

    前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了

    在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略



    有说的不正确或者不准确的地方欢迎留言指正


    有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力



    上期笔者介绍了状态模式,今天笔者介绍一个和状态模式的变种-----责任链模式。如果没有不了解状态模式的同学建议先看一下状态模式相关的讲解。

    责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的哦和关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    下面就以一个处理想吃食物请求的流程为背景,用责任链模式来展示的代码示例

    需要处理的结构体

    public class ResponsibilityContext
    {
        public string Type = "肉类";
        public string Description = "我想吃锅包肉";
        public bool AuditResult = false;
        public string AuditRemark = "";
    }
    
    public abstract class Handler
    {
        protected Handler successor;
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }
        public abstract void HandleRequest(ResponsibilityContext context);
    }
    
    class ConcreteHandler1 : Handler
    {
        public override void HandleRequest(ResponsibilityContext context)
        {
            context.AuditRemark += "-饮料相关-";
            if (context.Type == "饮料")
            {
                context.AuditResult = true;
                this.Log("{0}  处理请求  {1}", this.GetType().Name, context);
            }
            else if (successor != null)
            {
                successor.HandleRequest(context);
            }
        }
    }
    
    class ConcreteHandler2 : Handler
    {
        public override void HandleRequest(ResponsibilityContext context)
        {
            context.AuditRemark += "-素食处理-";
            if (context.Type == "素食")
            {
                context.AuditResult = true;
                this.Log("{0}  处理请求  {1}", this.GetType().Name, context);
            }
            else if (successor != null)
            {
                successor.HandleRequest(context);
            }
        }
    }
    
    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(ResponsibilityContext context)
        {
            context.AuditRemark += "-肉类处理-";
            if (context.Type == "肉类")
            {
                context.AuditResult = true;
                this.Log("{0}  处理请求  {1}", this.GetType().Name, context);
            }
            else if (successor != null)
            {
                successor.HandleRequest(context);
            }
        }
    }
    
    调用
        void Start()
        {
            ResponsibilityContext context = new ResponsibilityContext();
    
            Handler handler1 = new ConcreteHandler1();
            Handler handler2 = new ConcreteHandler2();
            Handler handler3 = new ConcreteHandler3();
    
            handler1.SetSuccessor(handler2);
            handler2.SetSuccessor(handler3);
    
            handler1.HandleRequest(context);
    
            this.Log($"是否处理成功{context.AuditResult}");
            this.Log($"AuditRemark:{context.AuditRemark}");
        }
    

    责任链的主要职责就是当客户提交一个请求时,请求时言链传递直至有一个ConcreteHandler对象负责处理它。
    而且在责任链方便的地方就是随时地增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。
    而状态模式是自动跳转的,不能指定下一个可以处理的对象。
    而且一个请求极有可能到了链的末端都不能得到处理,或者因为没有正确配置而得不到处理#

    优点

    1. 降低耦合度。它将请求的发送者和接收者解耦。
    2. 简化了对象。使得对象不需要知道链的结构。
    3. 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
    4. 增加新的请求处理类很方便。

    缺点:

    1. 不能保证请求一定被接收。
    2. 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
    3. 可能不容易观察运行时的特征,有碍于除错

    相关文章

      网友评论

        本文标题:Unity【话大】设计模式之责任链模式

        本文链接:https://www.haomeiwen.com/subject/uvbdsqtx.html