适配器模式

  适配器模式只是将某个对象的接口适配为另外一个对象所期望的接口,当要完成一个操作时,使用接口的对象不用关心借口内部是则么实现的,总之,适配器会根据实际情况去达到目的。这个讲着有点绕,还是举个例子吧。

  举个例子:下面这个图片,很完美的诠释了适配器模式,其中那个充电器的学术名叫“适配器”,为什么叫适配器呢?因为咱们平时使用它充电的时候,特别方便,既可以给Andriod充电,也可以给iPhone充电,甚至是给一些少见的老人机充电,不需要刻意的使用专门的充电头(适配器),只需要使用一个充电器,然后找到手机对应的数据线即可。想一想,咱们有关心充电器内部做了什么吗?不需要!!因为只需要插上一根数据线就可以了。

  另外举一个例子,在使用PHP操作MySQL数据库时,可能需MySQL,PDO,MySQLi中的一套扩展,这其中的每一套扩展可以理解为上面图片中的每一个手机的插口,要想成功的操作数据库,只需要在充电器(适配器)上实现一个功能,这个功能就是:让我们在操作数据库的时候随便选择一个适配器都能实现功能,这里就需要转换了。转换的方法很简单,看下面代码比较好理解。

<?php
//定义一个接口规范
interface Adapter{
	protected $db;
	public function connect($host,$username,$password,$dbname);
	public function query($sql);
	public function close();
}

//下面是MySQL,MySQLi,PDO类,分别实现了接口中的所有方法
class MySQL implements Adapter{
	public function connect($host,$username,$password,$dbname){
		$this->db=mysql_connect($host,$username,$password);
		mysql->select_db($dbname);
	}
	public function query($sql){
		return mysql_query($sql);
	}
	public function close(){
		mysql_close($this->db);
	}
}

class MySQLi implements Adapter{
	public function connect($host,$username,$password,$dbname){
		$this->db=mysql_connect($host,$username,$password,$dbname);
	}
	public function query($sql){
		return mysqli_query($this->db,$sql);
	}
	public function close(){
		mysqli_close($this->db);
	}
}

class PDO implements Adapter{
	public function connect($host,$username,$password,$dbname){
		$this->db=new PDO("mysql:host=$host;dbname=$dbname",$username,$password);
	}
	public function query($sql){
		return $this->db->query($sql);
	}
	public function close(){
		$this->db=null;
	}
}

//下面为测试代码 $db=new MySQL(); $db->connect("localhost","root","123456","test"); $result=$db->query("select * from user where id = 1"); $db->close(); $db=new MySQLi(); $db->connect("localhost","root","123456","test"); $result=$db->query("select * from user where id = 1"); $db->close(); $db=new PDO(); $db->connect("localhost","root","123456","test"); $result=$db->query("select * from user where id = 1"); $db->close(); ?>

  在测试部分,可能有人觉得这样直接指定要实例化的类名,为什么不直接单独写一套函数呢?的确,有这个想法是正确的,但是,这里实现了适配器模式,然后实例化的类,要实现一个功能,调用的方法名都是一样的,这就是适配器的好处,在使用的时候, 不用担心扩展的选择问题,只需要指定使用那一套扩展即可,当然,前提是已经为该扩展实现接口定义的方法。

原文地址:https://www.cnblogs.com/-beyond/p/7749765.html