委托模式 Delegation Pattern

未匹配的标注

定义

    有两个对象参与(两个对象协同)处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。
    委托模式属于行为型模式。许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。

设计的原则和思想

  1. 解耦委托者与被委托者。
  2. 不变部分是委托者和被委托者,变化部分是委托者与被委托者之间的协同方式。
  3. 核心思想是委托者与被委托者协同完成某个事情。

一句话概括设计模式

委托者对象提供原本的功能,被委托者对象提供附加功能。

结构中包含的角色

  1. Delegate 抽象委托行为接口
  2. AnotherRequest 另外的请求对象 - 被委托者
  3. Request 请求对象 - 委托者

最小可表达代码 - 事件监听

// 抽象委托行为接口
interface Delegate
{
    public function buyAirTicket();
}

// 另外的请求对象 - 被委托者
class AnotherRequest implements Delegate
{
    public function buyAirTicket()
    {
        echo '购买机票';
    }
}

// 请求对象 - 委托者
class Request
{ 
    private $delegate;

    public function __construct(Delegate $eelegate)
    {
        $this->delegate = $eelegate;
    }

    public function TakePlane()
    {
        $this->delegate->buyAirTicket();

        echo ' 坐飞机 ';
    }
}

$request = new Request(new AnotherRequest);
$request->TakePlane();

最小可表达代码 - 被委托协助委托者

// 抽象委托行为接口
interface Delegate
{
    public function buy($phone);
}

// 另外的请求对象 - 被委托者
class AnotherRequest implements Delegate
{
    public function buy($phone)
    {
        echo '买手机:' . $phone;
    }
}

// 请求对象 - 委托者
class Request implements Delegate
{ 
    private $delegate;

    public function __construct(Delegate $eelegate)
    {
        $this->delegate = $eelegate;
    }

    public function buy($phone)
    {
        $this->delegate->buy($phone);
    }
}

$request = new Request(new AnotherRequest);
$request->buy("诺基亚");

优点

  1. 通过任务委派能够将一个大型的任务细化。
  2. 将应用相关的内容与框架完全分离开。
  3. 避免过多的子类以及子类与父类的耦合。
  4. 通过委托传递消息机制实现分层解耦.

缺点

  1. 在任务比较复杂的情况下可能需要进行多重委派,容易造成紊乱。
  2. 容易导致职责分散,导致维护麻烦。

何时使用

  1. 当自身不具备某种功能时,可以通过引入另一种类型来提供相关的能力。

业务场景

  1. 上司分配任务给下属
  2. JVM在加载类使用的双亲委派模式。
  3. Java的Method类里的invoke()方法。
  4. JS的事件流就是委托模式。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~