怎么在c#项目中实现一个职责链模式

  介绍

这篇文章给大家介绍怎么在c#项目中实现一个职责链模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

前言

,,,在软件开发中,我们通常会遇到一种场景,比如某个请求,会依次经过系统中的很多个模块来处理,如果某个模块处理不了,则将请求传递给下一个模块,比如在订单处理中,首先要经过用户校验,商品库存充足校验,如果不满足条件,返回错误,如果满足条件才会到下一步处理。

,,,在ASP。网络核心里有中间件中间键的概念,每一个请求进来,都会经过一系列的处理程序,这是一种职责链模式,每一个处理器都会决定是否处理该请求,以及是否决定将该请求传递给一下请求继续处理。

,,,在。net的委托中,也有一个委托链概念,当多个对象注册同一事件时,对象将委托放在一个链上,依次处理。

,,,在JavaScript或者WPF的事件模型中,事件有冒泡和下沉,事件能够逐个向上级或者下级对象传递,每个对象都会决定是否会对该事件进行回应,或者终止事件的继续传递。

,,,这些都是典型的职责链模式,责任链模式为请求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,沿着这条链传递请求,直到有对象处理它为止。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

示例1

假设在一个电脑游戏中,每个角色都有两个属性:攻击值和防御值。

public  class 生物   {   ,public  string 名称;   ,public  int 攻击,防御;   ,public 生物(名称、string  int 攻击,int 防御)   ,{=,Name 名称;=,Attack 攻击;=,Defense 防御;   ,}      ,public  override  string  ToString ()   ,{   ,return “美元名称:{Name},攻击:{}的攻击,防御:{国防}“;   ,}   }

,,,,现在这个角色会在游戏中进行活动,他可能会捡到一些武器增加自己的攻击值或者防御值。我们通过CreatureModifer来修改该对象的攻击值或者防御值。通常,在游戏中会有多个修改器会对同一角色进行修改,比如捡到武器,然后捡到武器B等等,因此我们可以将这些修改器按照顺序附加到生物对象上进行逐个修改。

,,,在经典的职责链实现模式中,可以向下面这种方式来定义CreatureModifier对象:

public  class  CreatureModifier   {   ,protected  Creature 生物;   ,protected  CreatureModifier 下;   ,public  CreatureModifier (Creature 生物)   ,{=,this.creature 生物;   ,}   ,public  void 添加(CreatureModifier 米)   ,{   ,if  (next  !=, null)   ,{   ,next.Add (m);   ,}   其他的,   ,{=,next  m;   ,}   ,}   ,public  virtual  void 处理()   ,{   接下来,? .Handle ();   ,}   }

,,,在这个类中:

<李>

构造函数里保存对待修改对象生物的引用。

<李>

该类没有做多少工作,但他不是抽象类,其他类可以继承该对象。

<李>

添加方法可以添加其他CreatureModifier类到处理链条上。如果当前修改对下对象象为空,则赋值,否则将他添加到处理链的末端。

<李>

处理方法简单调用下个处理链上对象的处理方法。子类可以重写该方法以实现具体的操作。

,,,现在,可以定义一个具体的修改类了,这个类可以将角色的攻击值翻倍。

public  class  DoubleAttackModifier : CreatureModifier   {   ,public  DoubleAttackModifier (Creature  c),:,基地(c)   ,{   ,}      ,public  override  void 处理()   ,{   *=,creature.Attack  2;   ,Console.WriteLine ($“Doubling  {creature.Name} & # 39; s 攻击,攻击:{creature.Attack},防御:{creature.Defense}“);   ,base.Handle ();   ,}   }

,,,,该类继承自CreatureModifier类,并重写了处理方法,在方法里做了两件事,一是将攻击属性翻倍,另外一个非常重要,就是调用了基类的处理方法,让职责链上的修改器继续进行下去。千万不要忘记调用,否则链条在这里就会终止了,不会继续往下传递了。

,,,,接着,新建一个增加防御值的修改器,如果攻击值小于2,则防御值增加1:

怎么在c#项目中实现一个职责链模式