PHP之外观模式
2017-12-19 23:43
393 查看
外观(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类还能使调用者避免不正确地使用内部方法,从而减少错误的发生。
注1:这是《深入PHP:面对对象、模式与实践》第十章的部分内容(其他的都看不懂,逃~)
注2:此文章也可以在我单独的博客里面看到: https://feiffy.cc/%E3%80%8A%E6%B7%B1%E5%85%A5PHP%EF%BC%9A%E9%9D%A2%E5%AF%B9%E5%AF%B9%E8%B1%A1%E3%80%81%E6%A8%A1%E5%BC%8F%E4%B8%8E%E5%AE%9E%E8%B7%B5%E3%80%8B#.E5.A4.96.E8.A7.82.28Facade.29.E6.A8.A1.E5.BC.8F
相关文章推荐
- PHP设计模式系列 - 外观模式
- PHP设计模式-外观模式
- 【深入PHP 面向对象】读书笔记(十) - 让面向对象编程更加灵活的模式(三) - 外观模式
- Php设计模式之【外观模式Facade Pattern】
- php,java实现门面(外观)模式
- PHP设计模式-外观模式
- 外观模式及php实现
- PHP外观模式
- 初识PHP设计模式--外观模式
- PHP设计模式 外观设计模式
- PHP设计模式之装饰器模式,委托模式,外观模式
- php-设计模式-外观模式
- PHP设计模式之装饰器模式,委托模式,外观模式
- php设计模式--外观模式
- PHP设计模式系列 - 外观模式
- php-Facade(外观模式)
- php 门面模式(外观模式)
- php设计模式 Facade(外观模式)
- php 设计模式之 代理模式,适配器模式,外观模式