让面向对象编程更加灵活的的模式-----外观模式
问题
当使用子系统的代码是,有时候发现自己过于深入的调用子系统的逻辑代码,如果子系统代码总是不断变化,而你的代码缺又在许多不同地方与子系统代码交互,那么随着子系统的发展,代码越来越维护困难,外观模式要解决的就是使系统中的各层互相独立,以便项目中某一部分的修改尽量不影响其他地方。
代码实现
<?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()); ?>
效果
分离了项目中的不同部分
使得客户端访问代码变得更简洁,方便
只在一个地方调用子系统(productfacade中),减少了出错的可能性,并可预估子系统修改带来的问题所在