做项目学了个责任链模式,写了个例子记录一下~
(一本正经)先来看一下定义:
责任链模式的定义
定义: 使多个对象都有机会处理请求,从而避免请求的发送者与请求处理者耦合在一起。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
类型: 对象行为型模式
实质: 责任链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,从而实现请求发送者与请求处理者的解耦。
上代码(哈哈哈哈):
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上运行结果:
因篇幅问题不能全部显示,请点此查看更多更全内容