極簡設計模式-委託模式

long2ge發表於2021-12-15

定義

    有兩個物件參與(兩個物件協同)處理同一個請求,接受請求的物件將請求委託給另一個物件來處理。
    委託模式屬於行為型模式。許多其他的模式,如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了委託模式。

設計的原則和思想

  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

相關文章