设计模式-适配器模式
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();