PHP面板模式簡析

來源:互聯網
上載者:User

PHP面板模式簡析
外觀(Facade)模式

當使用子系統的代碼時,你也許會發現自己過於深入地調用子系統的邏輯代碼。如果子系統代碼總是在不斷變化,而你的代碼卻又在許多不同地方與子系統代碼互動,那麼隨著子系統的發展,你也許會發現維護代碼變得非常困難。

在項目中整合複雜的第三方代碼,或在系統中逐漸形成大量僅在系統自身內部有用的代碼,在這些情況下,你總可以套用面板模式,為複雜的系統建立一個簡單、清晰的介面。

假設有下面一段很亂的代碼,其功能是從檔案中擷取log資訊並將它轉換為對象:

function getProductFileLines($file){
    return file($file);
}

function getProductObjectFromID($id,$productname){
    // 一些資料庫查詢
    return new Product($id, $productname);
}

function getNameFromLine(){
    if (preg_match("/.*-(.*)\s\d+/"), $line, $array) {
        return str_replace('_', ' ', $array[1]);
    }
    return '';
}

function getIDFromLine($line){
    if (preg_match("/^(\d{1,3})-/", $line, $array)) {
        return $array[1];
    }
    return -1;
}

class Product(){
    public $id;
    public $name;
    public __construct($id, $name)
    {
        $this->id = $id;
        $this->id = $name;
    }
}

我們的目的是將包含類似下面資料的檔案轉換為一個對象數組:

 234-ladies_jumper 55
 532-gents_hat 44

用戶端使用該功能時要調用所有的方法:

$lines = getProductFileLines('text.txt');
$objects = array();
foreach ($lines as $line) {
    $id = getIDFromLine($line);
    $name = getNameFromLine($line);
    $objects[$id] = getProductObjectFromID($id, $name);
}

如果在項目中直接調用這些方法,那麼我們的代碼會和子系統緊緊耦合在一起。當子系統變化時,或者我們決定將其與子系統完全斷開時,代碼就會出問題。

下面這個簡單的類為上面的過程式代碼提供了一個介面:

class ProductFacade
{
    private $products = array();
   
    function__construct($file){
        $this->file = $file;
        $this->compile();
    }

    private function complie(){
        $lines = getProductFileLines($this->line);
        foreach ($lines as $line) {
            $id = getIDFromLine($line);
            $name = getNameFromLine($line);
            $this->products[$id] = getProductObjectFromID($id, $name);
        }
    }

    function getProducts(){
        return $this->products;
    }

    function getProduct($id){
        return $this->product[$id];
    }
}

現在,從一個log檔案訪問Product對象就簡單多了:

$facade = new ProductFacade('test.txt');
$facade->getProduct(234);

面板模式的好處:(1)對於調用者來說,存取碼變得簡潔、非常方便.(2),由於只在一個地方調用子系統,減少了出錯的可能.(3),Facade類還能使調用者避免不正確地使用內部方法,從而減少錯誤的發生。

本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151603.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.