zoukankan      html  css  js  c++  java
  • php实现适配器模式

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

    (一)为什么需要适配器模式

    1,某个操作数据库的有两套不同的数据库操作方法,我们通过适配器统一成一个接口。例如,我们待会把mysql和mysqli统一成一个接口。

    2,我们有多套数据库对应了多种数据库操作,例如MySQL,SqlServer,Oralce,Redis都有对应的操作函数,或操作类。PDO把这些都统一成一个接口。

    3,系统的增加一些新功能,创建了一个新的接口,但是老的接口并不想废弃。可以使用适配器模式,对用户隐藏这两个接口,提供用户所希望的接口。

    (二)适配器UML图

    (三)设计实例

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

    <?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 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();

    上面的代码只是一个示例,如果你运行以上的代码报了mysql函数不存在或是被废弃的错误。这是正常的,因为MySQL这套函数在PHP5.5以上的版本已经被废弃了。感兴趣的还可以去了解一下PDO的实现。
    通过上面的代码,我们可以看到,使用适配器可以把不同的操作接口封装起来,对外显示成用户所期望的接口。

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

    没错,适配器要做的就是这么回事。

    有些书也把适配器模式分为:类的适配器模式,对象的适配器模式,接口的适配器模式

    欢迎大家学习,交流
  • 相关阅读:
    mysql 系统表的作用
    从事务隔离级别谈到Hibernate乐观锁,悲观锁
    python 模拟登陆,请求包含cookie信息
    Python入门介绍
    mysql中设置小数
    分割png图片
    ubuntu 14.04 安装win7虚拟机
    rwx
    获取文件名称 basename 用法
    like tp
  • 原文地址:https://www.cnblogs.com/lijintao1025/p/8522026.html
Copyright © 2011-2022 走看看