设计方式-适配器情势

PHP设计方式那本书是1壹年买的,刚买的时候看了几篇,后来就没看了。近日在办事上遭受某个题材,因而认为有至关重要去重温一下。

适配器方式:将多少个类的接口转换到客户愿意的其它2个接口,使得本来由于接口不包容而不能够1起坐班的格外类能够一起干活。

一个简约的例子:作者房间里墙上有多少个插座,只可以插2脚的(日常会有二脚和3脚那三种),可是本身的记录本电源脚是三脚的,那下咋办?笔者总不可能拔了中间贰个脚插进去吧?

消除办法:作者买了二个多用插座,这么些多用插座上有各样接口,可以插两脚的也得以插三脚的,先把多用插座的两脚插到墙上的插座上,再把台式机的插座插到多效益插座上。那下能够用台式机玩游戏了。上面大家看下代码上是怎么落到实处的呢:

 

品类中保存不当的日志类

//获取错误
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();

相关文章