代理模式php
<?php /** * 代理模式:爲其餘對象提供一個代理以控制這個對象的訪問 它是給某一個對象提供一個替代者,使之在client對象和subject對象之間編碼更有效率。 代理能夠提供延遲實例化,控制訪問等 應用場景:若是須要建立一個資源消耗較大的對象,先建立一個消耗相對較小的對象來表示,真實對象只在須要時纔會被真正建立。 控制對原始對象的訪問。 * */ /** * 抽象主題角色(Subject):天氣 * */ interface Weather { public function request($city); public function display($city); public function isValidCity($city); } /** * 真實主題角色(RealSubject): * */ class RealWeather implements Weather { protected $_url = 'http://www.google.com/ig/api?&oe=utf-8&hl=zh-cn&weather='; protected $_weatherXml = '' ; function __construct(){ } public function request($city){ $this->_weatherXml = file_get_contents($this->_url . $city ); } public function display($city ){ // if ($this->_weatherXml == '') { // $this->request($city); // } echo '天氣預報'; } public function isValidCity($city){ } } /** * 代理角色(Proxy):延遲代理 * */ class ProxyWeather implements Weather { private $_client ; private function client() { if (! $this->_client instanceof RealWeather) { $this->_client = new RealWeather(); } return $this->_client; } public function request($city){ $this->_client->request($city); } public function isValidCity($city) { return $this->_client->isValidCity($city); } public function display($city) { return $this->client()->display($city); } } /** * 代理角色(Proxy):動態代理 * */ class DynamicProxyWeather { protected $_subject; public function __construct($subject) { $this->_subject = $subject; } public function __call($method, $args) { return call_user_func_array([$this->_subject, $method], $args); } } // 客戶端 class Client{ public static function proxy(){ $proxy = new ProxyWeather(); $proxy->display('beijing'); } public static function dynamic(){ $proxy = new DynamicProxyWeather(new RealWeather()); $proxy->display('beijing'); } } Client::proxy(); Client::dynamic();
橋連模式api
<?php /** * 橋連模式:實現系統在多個維度上的獨立變化 Bridge模式基於類的最小設計原則,經過使用封裝、聚合及繼承等行爲讓不一樣的類承擔不一樣的職責。 它的主要特色是把抽象(Abstraction)與行爲實現(Implementation)分離開來,從而能夠保持各部分的獨立性以及應對他們的功能擴展。 主要解決:在有多種可能會變化的狀況下,用繼承會形成類爆炸問題,擴展起來不靈活。 eg:顯示器有2一、2三、27寸,顏色有黑色、白色、花色,一般作法會產生9個類[21黑,21白,21花,23黑,23白,23花,27黑,27白,27花], 若是使用Bridge模式,只須要6個類便可【21,23,27,黑色,白色,花色】 */ // 尺寸基類 class BaseSize { protected $_size; public function setSize() { echo '尺寸是:' . $this->_size . '英寸;'; } } // 顏色基類 class BaseColor { protected $_color; public function setColor() { echo '顏色是:' . $this->_color; } } class Size21 extends BaseSize { public function __construct() { $this->_size = 21; } } class Size23 extends BaseSize { public function __construct() { $this->_size = 23; } } class Size27 extends BaseSize { public function __construct() { $this->_size = 27; } } class ColorBlack extends BaseColor { public function __construct() { $this->_color = '黑色'; } } class ColorWhite extends BaseColor { public function __construct() { $this->_color = '白色'; } } class ColorSuit extends BaseColor { public function __construct() { $this->_color = '花色'; } } class Client { public function buy() { echo '我要一臺顯示器:'; (new Size27())->setSize(); (new ColorWhite())->setColor(); } } (new Client())->buy(); // 我要一臺顯示器:尺寸是:27英寸;顏色是:白色
門面(外觀)模式ui
<?php /** * 外觀(門面)模式:爲了下降複雜性,經常將系統劃分爲若干個子系統,而一個功能經常是由子系統裏面的若干個單元組合而成。 Facade模式定義了一個高層接口,這個接口又調用了子系統的多個類和方法。 這樣,客戶端只須要直接與Facade交互,客戶端與子系統之間的複雜關係由Facade來實現,從而下降了系統的耦合度。 就是說,Facade對外隱藏了功能的具體實現細節,經過把這個功能的具體細節封裝成一個接口讓客戶端調用。 Facade對象是外界訪問子系統內部的惟一通道 */ // 殼 class Shell { public function set() { echo '手機裝上外殼'; } } // 屏幕 class Screen { public function set() { echo '手機裝上屏幕'; } } // 電池 class Battery { public function set() { echo '手機裝上電池'; } } // 富士康 class Facade { // 組裝手機 public static function product() { // 若是順序須要變更或者須要新增其餘部件,在這裏修改便可 echo '開始組裝手機'; (new Shell())->set(); (new Screen())->set(); (new Battery())->set(); echo '手機組裝完成'; } } // 蘋果公司 class Client { public function show() { // 複雜的組裝交給 Facade 處理 Facade::product(); } } (new Client())->show(); // 開始組裝 // 手機裝上外殼 // 手機裝上屏幕 // 手機裝上電池 // 手機組裝完成