【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核准;

 

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

转载于:https://www.cnblogs.com/fws94/p/7449268.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值