• 【Unity与23种设计模式】责任链模式(Chain of Responsibility)


    GoF中定义:

    “让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度。将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止。”

    举个现实中的例子:

    电信公司的客服系统。

    公司有很多客服,需要客服解决的问题更加纷繁复杂

    然而,每个问题都要经由每个客服,显然是不合理的

    于是,就把客服分层

    当有电话打进来时,首先接入的是电信客服

    电信客服询问之后,发现问题自己没法解决,可能与网络业务有关,于是转接网络业务客服

    如果网络业务客服也没有解决问题,又转给了网络机房客服

    最终问题得以解决。

    责任链模式让一群信息接收者能够一起被串联起来管理,让信息判断上能有一致的操作接口

    不必因为不同的接收者而必须执行“类转换操作”,并且让所有的信息接收者都有机会可以判断

    是否提供服务或将需求移往下一层接收者

    游戏中的例子便是植物大战僵尸的关卡设计

    判断消灭了多少僵尸,或者场上没有僵尸时跳转到下一波僵尸(下一关)

    //请求接收者接口
    public abstract class Handler {
        protected Handler m_NextHandler = null;
    
        public Handler(Handler theHandler){
            m_NextHandler = theHandler;
        }
    
        public virtual void HandleRequest(int Cost) {
            if (m_NextHandler != null)
                m_NextHandler.HandleRequest(Cost);
        }
    }
    //定义3个子类实现Handler接口,处理传入参数Cost所需要的判断
    public class ConcreHandler1 : Handler {
        private int m_CostCheck = 10;
        public ConcreHandler1(Handler theNextHandler):base(theNextHandler) {}
    
        public override void HandleRequest(int Cost)
        {
            if (Cost <= m_CostCheck)
                Debug.Log("ConcreteHandler1.HandleRequst核准");
            else
                base.HandleRequest(Cost);
        }
    }
    
    public class ConcreHandler2 : Handler {
        private int m_CostCheck = 20;
        public ConcreHandler2(Handler theNextHandler) : base(theNextHandler) { }
    
        public override void HandleRequest(int Cost)
        {
            if (Cost <= m_CostCheck)
                Debug.Log("ConcreteHanlder2.HandleRequst核准");
            else
                base.HandleRequest(Cost);
        }
    }
    
    public class ConcreHandler3 : Handler {
        private int m_CostCheck = 30;
        public ConcreHandler3(Handler theNextHandler) : base(theNextHandler) { }
    
        public override void HandleRequest(int Cost)
        {
            Debug.Log("ConcreteHanlder3.HandleRequst核准");
        }
    }
    //测试类
    public class TestChainofResponsibility {
        void UnitTest() {
            ConcreHandler3 theHandler3 = new ConcreHandler3(null);
            ConcreHandler2 theHandler2 = new ConcreHandler2(theHandler3);
            ConcreHandler1 theHandler1 = new ConcreHandler1(theHandler2);
    
            theHandler1.HandleRequest(10);
            theHandler1.HandleRequest(15);
            theHandler1.HandleRequest(20);
            theHandler1.HandleRequest(30);
            theHandler1.HandleRequest(100);
        }
    }
    //输出结果
    //ConcreteHandler1.HandleRequest核准;
    //ConcreteHandler2.HandleRequest核准;
    //ConcreteHandler2.HandleRequest核准;
    //ConcreteHandler3.HandleRequest核准;
    //ConcreteHandler3.HandleRequest核准;

    文章整理自书籍《设计模式与游戏完美开发》 菜升达 著

  • 相关阅读:
    第十三周学习进度条
    冲刺第四天
    第二天冲刺
    第三天冲刺
    第一天冲刺
    课下作业
    第十二周学习进度条
    课下作业
    webp与png、jpg相互转换
    Node疑难解决
  • 原文地址:https://www.cnblogs.com/fws94/p/7449268.html
Copyright © 2020-2023  润新知