讓面向對象編程更加靈活的的模式-----外觀模式

問題php

當使用子系統的代碼是,有時候發現本身過於深刻的調用子系統的邏輯代碼,若是子系統代碼老是不斷變化,而你的代碼缺又在許多不一樣地方與子系統代碼交互,那麼隨着子系統的發展,代碼愈來愈維護困難,外觀模式要解決的就是使系統中的各層互相獨立,以便項目中某一部分的修改儘可能不影響其餘地方。數據庫

代碼實現app

<?php
/*
appearance.php
外觀模式
*/

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

function getProductObjectFromId($id,$productname){
    //查詢數據庫
    return new product($id,$productname);
}

function getNameFromLine($line){
    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;
    function __construct($id,$name){
        $this->id = $id;
        $this->name = $name;
    }
}




//client,直接調用,那麼咱們的代碼和子系統緊密的耦合在一塊兒
$lines = getProductFileLines('test.txt');
$obj = array();
foreach ($lines as $line) {
    $id = getIdFromLine($line);

    $name = getNameFromLine($line);
    $obj[$id] = getProductObjectFromId($id,$name);
}

//採用外觀模式
class ProductFacade{
    private $products = array();
    function __construct($file){
        $this->file = $file;
        $this->compile();
    }
    private function compile(){
        $lines = getProductFileLines($this->file);
        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->products[$id];
    }
}

//client,
$ProductFacade = new ProductFacade('test.txt');
print_r($ProductFacade->getProducts());
?>

效果this

分離了項目中的不一樣部分spa

使得客戶端訪問代碼變得更簡潔,方便code

只在一個地方調用子系統(productfacade中),減小了出錯的可能性,並可預估子系統修改帶來的問題所在blog

相關文章
相關標籤/搜索