Unity——责任链模式(土味情话传递)

做项目学了个责任链模式,写了个例子记录一下~

(一本正经)先来看一下定义:

责任链模式的定义

定义: 使多个对象都有机会处理请求,从而避免请求的发送者与请求处理者耦合在一起。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

类型: 对象行为型模式

实质: 责任链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,从而实现请求发送者与请求处理者的解耦。

上代码(哈哈哈哈):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChaiOfResponsibility : MonoBehaviour
{
    public GirlType girlType;

    private void Start()
    {
        Debug.Log($"前面有一个很漂亮的{girlType},我们去撩一下");

        //new 出每一个对象
        BaseHandler Eren = new Eren();
        BaseHandler James = new James();
        BaseHandler Shank = new Shank();
        BaseHandler Liu = new Liu();

        //handlerA.NextHandler = handlerB;
        //handlerB.NextHandler = handlerC;

        //把责任链连起来
        Eren.SetNextHandler(James).SetNextHandler(Shank).SetNextHandler(Liu).SetNextHandler(Eren);

        //从头部开始挨个处理
        Eren.Handle(girlType);

    }

    [System.Serializable]       //结构体无法在Unity面板体现,加上这个特性就可以了
    public enum GirlType
    {
        萝莉,
        少女,
        御姐,
        阿姨
    }
    /// <summary>
    /// 抽象基类,定义抽象方法供子类实现
    /// </summary>
    public abstract class BaseHandler
    {
        //先定义出责任链上下一个负责人
        protected BaseHandler nextHandler = null;
        
        //属性
        public BaseHandler NextHandler
        {
            set { nextHandler = value; }
        }

        /// <summary>
        /// 提供设置下一个责任人的方法
        /// </summary>
        /// <param name="baseHandler">下一个责任人,因为责任人都是继承自BaseHanler,这里并不知道下一个是谁,所以变量名直接用baseHandler </param>
        /// <returns> 直接返回出下一个责任人 </returns>
        public BaseHandler SetNextHandler(BaseHandler baseHandler)
        {
            nextHandler = baseHandler;
            return nextHandler;
        }

        /// <summary>
        /// 把小姐姐类型传进抽象方法,供子类对象去实现处理
        /// </summary>
        public virtual void Handle(GirlType girlType) { }
    }

    class Eren : BaseHandler
    {
        /// <summary>
        /// 重写父类Handle方法
        /// </summary>
        public override void Handle(GirlType girlType)
        {
            //Eren专门撩阿姨
            if (girlType == GirlType.阿姨)
            {
                print("Eren:阿姨您长得真漂亮,看着真年轻!");
                print("阿姨:嗯?你叫谁阿姨?");
            }
            //如果不是阿姨,
            else
            {
                if (nextHandler != null)
                {
                    print("Eren:我撩不动");
                    //传给责任链上下一个对象处理
                    nextHandler.Handle(girlType);
                }
            }
        }
    }

    //以下对象实现原理跟第一个一样

    class James : BaseHandler
    {
        public override void Handle(GirlType girlType)
        {
            if (girlType == GirlType.萝莉)
            {
                print("James:小朋友长得真可爱,跟叔叔走,叔叔给你买糖吃!");
                print("萝莉:妈妈说不能跟陌生的叔叔走,尤其是怪蜀黍!");
            }
            else
            {
                if (nextHandler != null)
                {
                    print("James:我撩不动");
                    nextHandler.Handle(girlType);
                }
            }
        }
    }

    class Shank : BaseHandler
    {
        public override void Handle(GirlType girlType)
        {
            if (girlType == GirlType.少女)
            {
                print("Shank:小姐姐你有打火机嘛?");
                print("小姐姐:没有");
                print("Shank:那你是用什么点燃我的心");
            }
            else
            {
                if (nextHandler != null)
                {
                    print("Shank:我撩不动");
                    nextHandler.Handle(girlType);
                }
            }
        }
    }

    class Liu : BaseHandler 
    {
        public override void Handle(GirlType girlType)
        {
            if (girlType == GirlType.御姐)
            {
                print("Liu:姐姐好飒");
                print("御姐:滚!");
            }
            else if(nextHandler != null)
            {
                print("Liu:我撩不动");
                nextHandler.Handle(girlType);
            }
        }

    }
   

	
}

Unity上运行结果: 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值