加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP外观模式介绍

发布时间:2021-12-05 16:52:32 所属栏目:PHP教程 来源:互联网
导读:外观(Facade)模式 当使用子系统的代码时,你也许会发现自己过于深入地调用子系统的逻辑代码。如果子系统代码总是在不断变化,而你的代码却又在许多不同地方与子系统代码交互,那么随着子系统的发展,你也许会发现维护代码变得非常困难。 在项目中集成复杂的第
外观(Facade)模式
当使用子系统的代码时,你也许会发现自己过于深入地调用子系统的逻辑代码。如果子系统代码总是在不断变化,而你的代码却又在许多不同地方与子系统代码交互,那么随着子系统的发展,你也许会发现维护代码变得非常困难。
 
在项目中集成复杂的第三方代码,或在系统中逐渐形成大量仅在系统自身内部有用的代码,在这些情况下,你总可以应用外观模式,为复杂的系统创建一个简单、清晰的接口。
 
假设有下面一段很乱的代码,其功能是从文件中获取log信息并将它转换为对象:
 
function getProductFileLines($file){
    return file($file);
}
 
function getProductObjectFromID($id,$productname){
    // 一些数据库查询
    return new Product($id, $productname);
}
 
function getNameFromLine(){
    if (preg_match("/.*-(.*)sd+/"), $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类还能使调用者避免不正确地使用内部方法,从而减少错误的发生。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读