定義
有兩個物件參與(兩個物件協同)處理同一個請求,接受請求的物件將請求委託給另一個物件來處理。
委託模式屬於行為型模式。許多其他的模式,如狀態模式、策略模式、訪問者模式本質上是在更特殊的場合採用了委託模式。
設計的原則和思想
- 解耦委託者與被委託者。
- 不變部分是委託者和被委託者,變化部分是委託者與被委託者之間的協同方式。
- 核心思想是委託者與被委託者協同完成某個事情。
一句話概括設計模式
委託者物件提供原本的功能,被委託者物件提供附加功能。
結構中包含的角色
- Delegate 抽象委託行為介面
- AnotherRequest 另外的請求物件 - 被委託者
- 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("諾基亞");
優點
- 透過任務委派能夠將一個大型的任務細化。
- 將應用相關的內容與框架完全分離開。
- 避免過多的子類以及子類與父類的耦合。
- 透過委託傳遞訊息機制實現分層解耦.
缺點
- 在任務比較複雜的情況下可能需要進行多重委派,容易造成紊亂。
- 容易導致職責分散,導致維護麻煩。
何時使用
- 當自身不具備某種功能時,可以透過引入另一種型別來提供相關的能力。
業務場景
- 上司分配任務給下屬
- JVM在載入類使用的雙親委派模式。
- Java的Method類裡的invoke()方法。
- JS的事件流就是委託模式。
本作品採用《CC 協議》,轉載必須註明作者和本文連結