zoukankan      html  css  js  c++  java
  • 设计模式适配器模式

    PHP设计模式这本书是11年买的,刚买的时候看了几篇,后来就没看了。最近在工作上遇到一些问题,因此觉得有必要去重温一下。

    适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那个类可以一起工作。


    一个简单的例子:我房间里墙上有一个插座,只能插二脚的(通常会有二脚和三脚这两种),但是我的笔记本电源脚是三脚的,这下怎么办?我总不能拔了其中一个脚插进去吧?

    解决办法:我买了一个多用插座,这个多用插座上有各种接口,可以插两脚的也可以插三脚的,先把多用插座的两脚插到墙上的插座上,再把笔记本的插座插到多功能插座上。这下可以用笔记本玩游戏了。下面我们看下代码上是怎么实现的吧:

    项目中保存错误的日志类

    //获取错误
    class errorObject{
       private $_error;
       public function __construct($error){
            $this->_error = $error;
        }
       //返回错误
       public function getError(){
           return $this->_error;
       }
    }
    
    
    //日志类 把错误直接打印到屏幕
    class log2Screen{
        private $_errorObject;
        //实例化errorObject
        public function __construct($errorObject){
            $this->_errorObject = $errorObject;
        }
    
        public function write(){
            echo $this->_errorObject->getError();
        }
    
    }
    //项目中发表文章里的日志记录:
    $log = new log2Screen(new errorObject("invalid uid"));
    $log->write();
    
    变动1:好,现在如果要改变这个功能里的上述逻辑,把错误日志存到文件,怎么办?
    
    方法1:直接修改log2Screen类的write方法。这样做好像不太好,因为这样一改,其他地方用到这个方法的逻辑也变了,比如发表评论等等,而我只是想改发表文章的日志记录逻辑,所以这个方法不行。
    方法2:重写一个log类,类名变了,但是反正调用的地方不多,不用改很多,而且也不会影响到原来的log2Screen接口,所以也很方便。 
    
    class log2File{
        const LOG_FILE = 'debug.log';
        private $_errorObject;
        
        public function __construct($errorObject){
           $this->_errorObject = $errorObject;
        }
        
        public function write(){
           file_put_contents(self::LOG_FILE, $this->_errorObject->getError());
        }
    }
    //修改后的发表文章里的日志记录:
    $log = new log2File(new errorObject("invalid uid"));
    $log->write();
    
    思考:类名变了,如果要修改的地方很多,就要一一去修改,比较麻烦。 
    
    变动2:修改错误格式,加上时间。
    同上,如果直接修改getError方法 其他接口会受到影响。
    
    //创建适合log2File的error适配器
    class log2FileAdapater extends errorObject{
        private $_error;
        
        public function __construct($error){
            parent::__construct($error);
        }
        
        public function getError(){
            return date('Y-m-d H:i:s', time()).$this->_error;
        }
    }
    
    那么变成:
    $log = new log2File(new log2FileAdapater("invalid uid"));
    $log->write();
  • 相关阅读:
    C#代码控制tfs
    WindowService 执行命令
    自定义服务端Script控件支持javascript服务端路径?
    asp.net 实现LRC歌词播放
    asp.net ajax使用方法一
    左右两列布局
    XML反序列化一例
    自定义配置节备忘
    使用WTSGetActiveConsoleSessionId()的VISTA服务与桌面交互
    Java web 学习
  • 原文地址:https://www.cnblogs.com/justlikeheaven/p/2765286.html
Copyright © 2011-2022 走看看