php设计模式- 适配器模式
概念:适配器模式,将截然不同的函数接口封装成统一的API。实际应用举例,PHP的数据库操作有mysql、mysqli、pdo三种,可以用适配器模式统一。类似的场景还有将memcache、redis、file、apc等不同缓存函数统一成cache适配器。
适用场景:
系统要求使用现有的类,而且这些类的接口不符合系统的接口。
想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
两个类所做的事情相同或相似,但是具有不同接口。
旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有的类。
使用第三方组件,接口定义与我们的定义不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。
主要角色:
Target(目标角色):定义客户端使用的与特定领域相关的接口,即我们所期待得到的。
Adaptee(源角色):需要进行适配的接口。
Adapter(适配器角色):对Adaptee的接口与Target接口进行适配。适配是本模式的核心。适配器把原接口转换成目标接口,此角色为具体类。
下面是一个数据库适配器代码模型:
1.Target
Libs/IDatabase.php
<?php namespace Libs; /** * Target */ interface IDatabase { function connect($host,$user,$pwd,$dbname); function query($sql); function close(); }
2.Adapter(对Adaptee进行适配)
Libs/Database/MySQL.php
<?php namespace Libs\Database; use Libs\IDatabase; class MySQL implements IDatabase { protected $conn; public function connect($host,$user,$pwd,$dbname) { //mysql_connect 是Adaptee $conn = mysql_connect($host,$user,$pwd); mysql_select_db($dbname); $this->conn = $conn; } public function query($sql) { //mysql_query<span style="font-family: Arial, Helvetica, sans-serif;">是Adaptee</span> $res = mysql_query($sql,$this->conn); return $res; } public function close() { //mysql_close 是adaptee mysql_close($this->conn); } }
Libs/Database/MySQLi.php
<?php namespace Libs\Database; use Libs\IDatabase; class MySQLi implements IDatabase { protected $conn; public function connect($host,$user,$pwd,$dbname) { $conn = mysqli_connect($host,$user,$pwd,$dbname); $this->conn = $conn; } public function query($sql) { $res = mysqli_query($this->conn,$sql); return $res; } public function close() { mysqli_close($this->conn); } }
Libs/Database/PDO.php
<?php namespace Libs\Database; use Libs\IDatabase; class PDO implements IDatabase { protected $conn; public function connect($host,$user,$pwd,$dbname) { $conn = new \PDO("mysql:host=$host;dbname=$dbname", $user, $pwd); $this->conn = $conn; } public function query($sql) { return $this->conn->query($sql); } public function close() { unset($this->conn); } }
3.调用
$db= new Libs\Database\MySQL(); $db->connect('localhost', 'username', 'pwd', 'test'); $db->query('show databases'); $db->close();
推荐阅读: