• PHP之外观模式


    外观(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类还能使调用者避免不正确地使用内部方法,从而减少错误的发生。

    PS1:这是《深入PHP:面对对象、模式与实践》第十章的部分内容(其他的都看不懂,逃~)
    PS2:此文章也可以在我单独的博客里面看到: PHP之外观模式

  • 相关阅读:
    C# 调用线程并行上下文穿透-ILogicalThreadAffinative+CallContext
    C# 多线程调用静态方法或者静态实例中的同一个方法-方法内部的变量是线程安全的
    解析 .Net Core 注入——注册服务
    [Python]编码声明:是coding:utf-8还是coding=urf-8呢
    Vue加载组件、动态加载组件的几种方式
    源码版本管理工具 :TFS GIT
    Microsoft/Git-Credential-Manager-for-Mac-and-Linux
    SqlServer 对分组的内容进行拼接-group_concat
    MFC中页面设置对话框CPageSetupDialog
    MFC中查找替换对话框CFindReplaceDialog类
  • 原文地址:https://www.cnblogs.com/feiffy/p/8068327.html
Copyright © 2020-2023  润新知