定义
让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度。将说有的接收者对象串接起来,让请求沿着串接传递,直到有一个对象可以处理为止。
组成部分
Handler(请求接收者接口)
定义可以处理客户端请求事项的接口。
可包含可链接下一个同样能处理的请求的对象引用。
ConcreteHandler1,ConcreteHandler2(实现请求接收者接口)
实现请求处理接口,并判断对象本身是否能处理这次请求。
不能完成请求的话,交由后继者(下一个)来处理。
Client(请求发送者)
将请求发送给的一个接收者对象,并等待请求的回复。
游戏应用
在设计植物大战僵尸中,僵尸来领波次的设置是用了责任链模式。
Handler
public abstract class StageHandler
{
protected StageHandler stageHandler = null;
public StageHandler(StageHandler stageHandler)
{
this.stageHandler = stageHandler;
}
public virtual void HandleRequset(int enemyNum)
{
if (stageHandler != null)
{
stageHandler.HandleRequset(enemyNum);
}
}
}
ConcreteHandler1,ConcreteHandler2
public class StageConcreteHandler1 : StageHandler
{
public StageConcreteHandler1(StageHandler stageHandler) : base(stageHandler) { }
public override void HandleRequset(int enemyNum)
{
//敌人数量小于等于20,下一波开始
if (enemyNum <= 20)
{
stageHandler.HandleRequset(enemyNum);
}
}
}
public class StageConcreteHandler2 : StageHandler
{
public StageConcreteHandler2(StageHandler stageHandler) : base(stageHandler) { }
public override void HandleRequset(int enemyNum)
{
// 敌人数量为0结束
if (enemyNum <= 0)
{
stageHandler.HandleRequset(enemyNum);
//通知游戏结束
}
}
}
Client
int enemyNum = 50;
StageConcreteHandler1 stageConcreteHandler1;
public void init()
{
StageConcreteHandler2 stageConcreteHandler2 = new StageConcreteHandler2(null);
stageConcreteHandler1 = new StageConcreteHandler1(stageConcreteHandler2);
}
public void EnemyDead()
{
enemyNum--;
stageConcreteHandler1.HandleRequset(enemyNum);
}
优缺点
责任链模式让一群信息接收者能够一起被串联起来管理,让信息判断上能有一致的操作接口,不必因为不同的接收者而必须执行类转换操作,并且让所有的信息接收者都有机会可以判断是否提供服务或将需求移往下一个信息接收者,在后续的系统维护上,也可以轻易地增加接收者类。