委託者模式
為其它對象提供一種代理以控制對這個對象的訪問
簡單的理解如下圖所示:
下面我們匯入一個情境來學習委託者模式:
電商網站上面現在賣有茶軸鍵盤,電扇網站會員和電扇網站普通會員買的折扣是不一樣的,現在我們類比不同使用者購買鍵盤訂單的價格。
首先,建立了以下的目錄結構
其中user就是我們項目的委託者代理
實體:
keyboard.php
<?phpclass keyboard{ //鍵盤價格 public function getPrice() { return 1500; }}
使用者等級
普通使用者noruser.php
<?php/** * Class noruser * 普通使用者類 */class noruser{ //普通會員折扣 public function getDisCount() { return 0.95; }}
網站會員使用者vipuser.php
<?php/** * 網站會員 */class vipuser{ //電商網站會員折扣 public function getVipDisCount() { return 0.5; }}
委託者代理
user.php
<?php//使用者代理程式類class user{ public $delegator=null;//委託者對象 function __call($name, $arguments) { // TODO: Implement __call() method. if ($this->delegator!=null) { return call_user_func_array([$this->delegator,$name],$arguments); } return false; }}
類比返回商品價格
order.php
<?php/** * 類比示範使用委託這模式返回商品價格 */require ("keyboard.php");require ('user.php');require ('noruser.php');require ("vipuser.php");$user=new user();$keyboard=new keyboard();$user->delegator=new vipuser();$user->getVipDisCount();echo "會員購買茶軸鍵盤的價格是:".$keyboard->getPrice()*$user->getVipDisCount();echo "<br/>";$user->delegator=new noruser();echo "會員購買茶軸鍵盤的價格是:".$keyboard->getPrice()*$user->getDisCount();
效果如下:
優點:
1.職責清晰 真實的角色就是實現的商務邏輯,不用關心其他非本指責的事務
2.高擴充性 具體主題角色不能怎麼變化,只要它實現了介面,代理類完全可以在不做任何修改的情況下使用
3.智能化 動態代理是最好的體現,即在運行階段才指定實際代理對象