1.责任链模式
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
2.与装饰者模式的异同
相同点:
-
装饰者模式和责任链模式都可以有任意多个装饰者/拦截器。
-
装饰者/拦截器可以在最终处理的前/后添加自己的处理逻辑。
不同点:
-
装饰者模式必须要有一个被装饰者,装饰者装饰被装饰者,但装饰者的类型永远不变。责任链模式是对事件的处理,重要的是处理的过程而不是返回的结果
-
装饰者模式中任意一个装饰者都会生效,而责任链模式中部分拦截器可能没有机会处理事件。
非常好的责任链模式讲解
3.代码实现
下面是在Unity中代码模拟测试,代码挂载在物体上就可以测试运行:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour, IExcute
{
public UnityEngine.UI.Image[] images;
public int index = 0;
private int imaUnlockCount;
private void Start()
{
BaseLevel Level1 = new Level1(this);
BaseLevel Level2 = new Level2(this);
BaseLevel Level3 = new Level3(this);
Level1.SetLevel(Level2);
Level2.SetLevel(Level3);
Level1.Handle();
for (var i = 0; i < imaUnlockCount; i++)
{
images[i].GetComponent<UnityEngine.UI.Image>().color = new Color(1, 1, 1);
}
}
public int GetIndex()
{
return index;
}
public void Handle()
{
print(imaUnlockCount++);
}
}
public class Level1 : BaseLevel
{
public Level1(IExcute player) : base(player)
{
}
public override void Handle()
{
if (player.GetIndex() >= 0)
{
player.Handle();
if (baseLevel != null)
baseLevel.Handle();
}
}
}
public class Level2 : BaseLevel
{
public Level2(IExcute player) : base(player)
{
}
public override void Handle()
{
if (player.GetIndex() >= 1)
{
player.Handle();
if (baseLevel != null)
baseLevel.Handle();
}
}
}
public class Level3 : BaseLevel
{
public Level3(IExcute player) : base(player)
{
}
public override void Handle()
{
if (player.GetIndex() >= 2)
{
player.Handle();
if (baseLevel != null)
baseLevel.Handle();
}
}
}
public interface IExcute
{
int GetIndex();
void Handle();
}
public abstract class BaseLevel
{
protected IExcute player;
public BaseLevel(IExcute player)
{
this.player = player;
}
protected BaseLevel baseLevel = null;
public virtual void SetLevel(BaseLevel BL)
{
this.baseLevel = BL;
}
public abstract void Handle();
}
测试结果
测试成功!