优点:
1、被适配者通过适配器完成对适配目标的适配,以达到对客户使用透明的目的。
2、如果使用设配器设计模式,那么绝大部分情况下,不会丢失现有的功能性,只是使用或消耗的方式不同。 缺点:
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
示例代码:
(1)数据库场景
//适配目标,规定的接口将被适配对象实现
interface> public function connect($host, $username, $password, $database);
public function query($sql);
}
//适配器
class Mysql implements> protected $connect;
public function connect($host, $username, $password, $database){
$connect = mysql_connect($host, $username, $password);
mysql_select_db($database, $connect);
$this->connect = $connect;
//...
}
public function query($sql) {
//...
}
}
//适配器
class Postgresql implements> protected $connect;
public function connect($host, $username, $password, $database) {
$this->connect = pg_connect("host=$host dbname=$database user=$username password=$password");
//...
}
public function query($sql) {
//...
}
}
//客户端使用
$client = new Postgresql();
$client->query($sql);
(2)错误处理场景
//原始错误处理
class errorObject{
private $_error;
public function __construct($error){
$this->__error = $error;
}
public function getError(){
return $this->__error;
}
}
//通过适配器扩展错误处理
class logToCsvAdapter extends errorObject{
private $_errorNumber ,$__errorText;
public function __construct($error){
parent::__construct($error);
$parts = explode(':',$this-getError());
$this->__errorNumber = $parts[0];
$this->__errorText = $parts[1];
}
public function getErrorNumber(){
return $this->_errorNumber;
}
public function getErrorText(){
return $this->__errorText;
}
}