澳门威利斯人_威利斯人娱乐「手机版」

来自 办公软件 2020-02-03 08:02 的文章
当前位置: 澳门威利斯人 > 办公软件 > 正文

职责链模式,责任链模式

  • 切切实实的拍卖类1

结构(Structure)

定义:为号召创制了四个选取者对象的链,使多少个指标都有空子管理央求,进而制止央求的发送者和选拔者之间的耦合关系。将以此指标连成一条链,并顺着那条链传递该央求,直到有叁个目的管理他得了。这种情势给与乞求的门类,对央求的发送者和采用者进行解耦。各种管理者必须绑定下二个风云管理者(最终三个不等),技术确定保障权利链往下传播。
运用意况: 

确立三个对象链,依据钦点顺序管理调用;假如内部有三个目的不大概管理当下的情景,移交下二个对象处理

    public abstract class BaseHandler
    {
        public BaseHandler(BaseHandler next)
        {
            this.Next = next;
        }

        public BaseHandler Next { get; set; }

        protected abstract bool CanHandleRequest(Request request);

        public virtual void HandleRequest(Request request)
        {
            if (this.Next != null)
            {
                this.Next.HandleRequest(request);
            }
        }
    }

    public class AHandler : BaseHandler
    {
        public AHandler(BaseHandler next)
            : base(next)
        {
        }

        public override void HandleRequest(Request request)
        {
            if (this.CanHandleRequest(request))
            {
                //...
            }
            else
            {
                base.HandleRequest(request);
            }
        }

        protected override bool CanHandleRequest(Request request)
        {
            //...
        }
    }

    public class BHandler : BaseHandler
    {
        public BHandler(BaseHandler next)
            : base(next)
        {
        }

        public override void HandleRequest(Request request)
        {
            //...
        }

        protected override bool CanHandleRequest(Request request)
        {
            //...
        }
    }

    public class CHandler : BaseHandler
    {
        public CHandler(BaseHandler next)
            : base(next)
        {
        }

        public override void HandleRequest(Request request)
        {
            //...
        }

        protected override bool CanHandleRequest(Request request)
        {
            //...
        }
    }

    public class Request
    {
        //...
    }

    public class Sender
    {
        public void Process(BaseHandler handler)
        {
            Request request = new Request();
            //...
            handler.HandleRequest(request);
        }
    }

1、减弱耦合度。它将乞求的发送者和接受者解耦。

一点对象央求的选择者只怕有五颜六色,变化莫测……

4、扩展新的央浼管理类很有益于。

<?phpuse ChainOfResponsibilitiesConcreteHandler1;use ChainOfResponsibilitiesConcreteHandler2;// 注册自加载spl_autoload_register(function  { require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\', '/', $class) . '.php';});//设置责任链上下家$handler1 = new ConcreteHandler1(new ConcreteHandler2;$request = [1, -1, 2];foreach ($request as $value) { $handler1->handle;}//输出结果当前对象2:举报处理完毕当前对象1:举报处理完毕当前对象2:举报处理完毕

图片 1

使用:请假系统,以下案例通过规范请假天数来决断是不是满意条件,满足则赶回,不知足则调用下个链的剖断方法。

namespace ChainOfResponsibilities;/** * handler 抽象类 * Class Handler * @package ChainOfResponsibilities */abstract class Handler{ /** * 定义下一级处理对象 * @var null */ private $successor = null; /** * 输入集成处理对象 * Handler constructor. * @param Handler|null $handler */ public function __construct(Handler $handler = null) { $this->successor = $handler; } /** * 通过使用模板方法模式这种方法可以确保每个子类不会忽略调用继承 * * @param int $request * @return mixed */ final public function handle(int $request) { $processed = $this->processing; if ($processed ===null) { // 请求尚未被目前的处理器处理 => 传递到下一个处理器。 if ($this->successor !== null) { $processed = $this->successor->processing; } } return $processed; } abstract protected function processing(int $request);}

Chain Of Responsibility 形式的几当中心

1、不能够保证须求一定被吸收接纳。

 

2、简化了指标。使得对象没有需求知道链的组织。

  • 任务链格局, 使多个指标皆有空子管理央浼,从而防止央浼的发送者和接纳者之间的耦合关系。将以此指标连成一条链,并顺着那条链传递该乞请,直到有二个对像管理它甘休。
  • 选拔者和发送者都并未有对方的显明音讯,且链中的对象本身也并不知道链的构造。结果是职务链可简化对象的相互连接,它们仅须要保持多个向其后继者的援用,而无需保险它富有的候选人的援引。

动机(Motivation)

 

  • 切实的处理类2

 

2.实际管理者剧中人物,假使有下家且条件不满意自家管理原则,就将供给传给下家,不然就管理诉求

使三个对象都有机遇管理诉求,进而防止诉求的发送者和采用者之间的耦合关系。将这个目的连成一条链,并沿着那条链传递央求,直到有三个对象管理它结束。——《设计形式》GoF

2、在不名扬四海内定选用者的场地下,向四个对象中的八个付出三个诉求。

namespace ChainOfResponsibilities;class ConcreteHandler1 extends Handler{ /** * 处理 * @param int $request * @return $this|null */ protected function processing(int $request) { if ($request < 0) { echo "当前对象1:举报处理完毕" . '<br>'; return $this; } return null; }}

要是大家不指望Sender中犹如此多的Handler的调用,能够因此问责链格局改进:

3、加强给目的指使任务的八面驶风。通过改造链内的积极分子要么调节它们的主次,允许动态地新扩张只怕去除权利。

  • 试行调用
  • Chain Of Responsibility 格局的行使场所在于“贰个伸手恐怕有四个接收者,可是最后实在的选择者唯有三个”,独有那个时候诉求发送者与接收者的耦合才有希望现身“变化虚亏”的症状,任务链的指标正是将双方解耦,进而更加好地应对转移。
  • 应用了Chain Of Responsibility 格局后,对象的职务分担将更具灵活性。大家得以在运转时动态增加、改过需要的拍卖职分。
  • 借使央求传递到任务链的末梢仍得不各管理,应该有八个甩卖的缺省机制。那也是每多个经受对象的权力和义务,实际不是发出央浼的对象的义务。
  • 这种链传递的法子功能十分的低。
abstract class Handler
{ 
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private Handler successor;
     //定义下家的引用
    public Handler Successor
    {
        get { return successor; }
        set { successor = value; }
    }

    public abstract bool PassRequest(Request request);
}

public class Request
{
  public int Day;
  public string Reason;
  public Request(int day, string reason)
  {
    Day = day;
    Reason = reason;
  }
}

本文由澳门威利斯人发布于办公软件,转载请注明出处:职责链模式,责任链模式

关键词: 澳门威利斯人 设计模式 PHP 模式 责任