zoukankan      html  css  js  c++  java
  • 让面向对象编程更加灵活的的模式-----外观模式

    问题

    当使用子系统的代码是,有时候发现自己过于深入的调用子系统的逻辑代码,如果子系统代码总是不断变化,而你的代码缺又在许多不同地方与子系统代码交互,那么随着子系统的发展,代码越来越维护困难,外观模式要解决的就是使系统中的各层互相独立,以便项目中某一部分的修改尽量不影响其他地方。

    代码实现

    <?php
    /*
    appearance.php
    外观模式
    */
    
    function getProductFileLines($file){
        return file($file);
    }
    
    function getProductObjectFromId($id,$productname){
        //查询数据库
        return new product($id,$productname);
    }
    
    function getNameFromLine($line){
        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;
        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中),减少了出错的可能性,并可预估子系统修改带来的问题所在

  • 相关阅读:
    Qt Create or VS 2015 使用 Opencv330 相机静态库链接错误如何解决?
    Qt create 如何构建 ActiveX 控件?
    VB 如何调用 c++ DLL?
    Opencv 330 如何裁剪图片中大的目标?
    Opencv 330 如何進行圖像的旋轉?
    Qt 开发 MS VC 控件终极篇
    Qt 5.9.4 如何静态编译和部署?
    图片理论基础
    iOS平台设置系统状态栏(通知栏、顶部状态栏)样式背景颜色或透明
    jQuery基础
  • 原文地址:https://www.cnblogs.com/rcjtom/p/6066221.html
Copyright © 2011-2022 走看看