問題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