PHP适配器模式
下一篇: PHP反射类 ReflectionClass
适配器模式,可以将截然不容的函数接口封装成统一的API。通俗的理解就是将不同接口适配成统一的API接口,使得原本不兼容的接口能够一起工作。
实际应用举例,PHP的数据库操作有mysql,mysqli,pdo等,可以使用适配器模式统一成一致。类似的场景还有cache适配器,比如将memcache,redis,file,apc等不同缓存,统一成一致的接口。比如下面的数据库实例:
//首先定义一个统一接口 //在不同适配中,具体函数操作不一样,但接口一致 interface IDatabase { function connect($host,$user,$passwd,$dbname); function query($sql); function close(); } //下面定义一个用mysql操作数据库的类 class Mysql implements IDatabase { protected $conn; function connect($host,$user,$passwd,$dbname) { $conn = mysql_connect($host,$user,$passwd); mysql_select_db($dbname,$conn); $this->conn = $conn; } function query($sql) { $res = mysql_query($sql,$this->conn); return $res; } function close() { mysql_close($this->conn); } } //下面使用同一个接口,但用mysqli进行数据库操作 class Mysqli implements IDatabase { protected $conn; function connect($host,$user,$passwd,$dbname) { $conn = mysqli_connect($host,$user,$passwd,$dbname); $this->conn = $conn; } function query($sql) { $res = mysqli_query($this->conn,$sql); return $res; } function close() { mysqli_close($this->conn); } } //同理,用pdo进行数据库操作 class PDO implements IDatabase { protected $conn; function connect($host,$user,$passwd,$dbname) { $conn = new \PDO("mysql:host=$host;dbname=$dbname",$user,$passwd); $this->conn = $conn; } function query($sql) { return $this->conn->query($sql); } function close() { unset($this->conn;) } } //当选择Mysql类操作时 $db = new Mysql(); //下面改成你自己的用户密码和数据库名称 $db->connect('localhost','root','root','test'); $db->query($sql);
上面就是一个完整的适配器模式的例子。首先我们约定了一个统一接口,接口定义了统一的方法,约定好后再分别去创建每一个适配器实例,而这些适配器实例都遵循一开始约定的接口规则。这样规范的好处是,被适配者通过个人情况去选择特定适配器完成对适配目标的适配。比如在上面的数据库例子中,喜欢PDO方法的,可以选择PDO类去操作数据库,而在一些版本比较低的php环境中,可能还不支持PDO,那么这些用户可以选择Mysql类去操作数据库,这样大大方便了不同用户的场景选择。
总结,适配器模式定义的角色:
Target适配目标,该角色定义把其他类转换为何种接口,也就是我们的期望接口。
Adaptee被适配者,就是需要被适配的接口。
Adapter适配器,其他的两个角色都是已经存在的角色,而适配器角色是需要新建立的,它用来对Adaptee与Target接口进行适配。
上面的例子中
Target适配目标: IDataBase接口
Adaptee被适配者:Mysql 和Mysqli和PDO的数据库操作函数
Adapter适配器 :Mysql类和Mysqli类和PDO类
下一篇: PHP反射类 ReflectionClass