php设计模式之一结构型--适配器模式

最近在学习设计模式,很多地方还理解的不够。在这里记录一下自己学习的东西,方便自己以后查看和理解,同时也给正在学这部分的同学提供一点参考。

适配器模式(Adapter Pattern):将某个对象的接口适配为另一个对象所期望的接口。属于结构型设计模式。


为什么需要适配器模式
  1,某个操作数据库的有两套不同的数据库操作方法,我们通过适配器统一成一个接口。例如,我们待会把mysql和mysqli统一成一个接口。
  2,我们有多套数据库对应了多种数据库操作,例如MySQL,SqlServer,Oralce,Redis都有对应的操作函数,或操作类。PDO把这些都统一成一个接口。
  3,系统的增加一些新功能,创建了一个新的接口,但是老的接口并不想废弃。可以使用适配器模式,对用户隐藏这两个接口,提供用户所希望的接口。

代码示例 :把MySQL和mysqli统一成一个接口,用户可以调用同样的方法使用MySQL和mysqli操作数据库。

//MySQL待操作适配类 
class MySQLAdapter 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 MySQLiAdapter implements Target { 
    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();

通过上面的代码,我们可以看到,使用适配器可以把不同的操作接口封装起来,对外显示成用户所期望的接口。

这就好比你家墙上有一个电源三相插孔,但是插孔的孔距之间太小。你的电器三相插头插脚距太大的插不进去,或许你还有个两相的插头,或许你还有条USB线和type-C线,这些都没法插到三相接口里。于是你买了个插脚适合插到你墙上的排插,然后这个排插是这些年新出的,USB也能插。于是你把你的三相插头,两相插头,USB线,type-c线都插到排插上。实际上就是间接地连在了你墙壁上的三相插孔上

 

posted @ 2017-10-24 15:49  CandyChen  阅读(121)  评论(0)    收藏  举报