极简设计模式-委托模式

委托模式 - 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
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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