极简设计模式-委托模式

委托模式 - Delegation

定义

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

设计的原则和思想

  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的事件流就是委托模式。
本作品采用《CC 协议》,转载必须注明作者和本文链接
Long2Ge
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!