🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
(一)为什么需要适配器模式 1,某个操作数据库的有两套不同的数据库操作方法,我们通过适配器统一成一个接口。例如,我们待会把mysql和mysqli统一成一个接口。 2,我们有多套数据库对应了多种数据库操作,例如MySQL,SqlServer,Oralce,Redis都有对应的操作函数,或操作类。PDO把这些都统一成一个接口。 3,系统的增加一些新功能,创建了一个新的接口,但是老的接口并不想废弃。可以使用适配器模式,对用户隐藏这两个接口,提供用户所希望的接口。 ``` <?php //MySQL待操作适配类 class MySQLAdaptee implements Target { protected $conn; //用于存放数据库连接句柄 //实现连接方法 public function connect($host, $user, $passwd, $dbname) { $conn = mysql_connect($host, $user, $passwd); mysql_select_db($dbname, $conn); $this->conn = $conn; } //查询方法 public function query($sql) { $res = mysql_query($sql, $this->conn); return $res; } //关闭方法 public function close() { mysql_close($this->conn); } } //MySQLi操作待适配类 class MySQLiAdaptee { protected $conn; public function connect($host, $user, $passwd, $dbname) { $conn = mysqli_connect($host, $user, $passwd, $dbname); $this->conn = $conn; } public function query($sql) { return mysqli_query($this->conn, $sql); } public function close() { mysqli_close($this->conn); } } //用户所期待的接口 Interface Target{ public function connect($host, $user, $passwd, $dbname); public function query($sql); public function close(); } //用户期待适配类 Class DataBase implements Target { protected $db ; //存放MySQLiAdapter对象或MySQLAdapter对象 public function __construct($type){ $type = $type."Adapter" ; $this->db = new $type ; } public function connect($host, $user, $passwd, $dbname){ $this->db->connect($host, $user, $passwd, $dbname); } public function query($sql){ return $this->db->query($sql); } public function close(){ $this->db->close(); } } //用户调用同一个接口,使用MySQL和mysqli这两套不同示例。 $db1 = new DataBase('MySQL'); $db1->connect('127.0.0.1','root','1234','myDB');die; $db1->query('select * from test'); $db1->close(); $db2 = new DataBase('MySQLi'); $db2->connect('127.0.0.1','root','1234','myDB'); $db2->query('select * from test'); $db2->close(); ``` 场景描述 比如现在有一个支付工具Paypal,通过调用$Paypal->sendPayment($amount)就可以进行支付,但是过了一段时间,这个调用方法名称改变了,或者是改用其它支付工具,显然将每个调用到这个方法的代码都改动一次是不太现实的,这个时候就可以考虑使用适配器模式进行封装; ``` <?php class Paypal { public function sendPayMent($amount) { echo "pay by Paypal:".$amount."<br>"; } } class Skrill { public function doPayment($amount) { echo "pay bySkrill:".$amount."<br>"; } } class Adapter { private $adapter; public function __construct($adaptee) { $this->adapter = $adaptee; } public function send($amount) { if ($this->adapter == 'Paypal') { $send = new Paypal(); $send->sendPayMent($amount); } if ($this->adapter == 'Skrill') { $send = new Skrill(); $send->doPayment($amount); } } } $paypal = new Adapter('Paypal'); $paypal->send(50); ```