php設計模式2

代理模式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();
// 開始組裝
// 手機裝上外殼
// 手機裝上屏幕
// 手機裝上電池
// 手機組裝完成
相關文章
相關標籤/搜索