设计模式适配器模式

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();
原文地址:https://www.cnblogs.com/justlikeheaven/p/2765286.html