适配器模式是最容易理解的设计模式之一,应用也很广泛,常见的应用场景有数据库底层连接的封装和高速缓存类底层封装等等,在开源程序中常见框架都有适配器模式的应用,例如thinkphp中模型基类封装的数据连接。我为自己网站(www.ruanpower.com)设计的框架LEAFMVC中模型层封装数据库也用到了适配器模式。

一句话描述:适配器就是利用继承,暴露相同接口。

作用:一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,暴露共同的接口去调用

组成方式:1个接口(指定被暴露的共同方法),若干具体实现

伪代码演示:设计一个无缝切换mysqli数据库连接或者pdo数据库连接的程序,业务逻辑无需了解底层数据库的连接方式,只需要调用db对象方法即可

//数据库接口
interface IDb {

    //连接数据库
    function connect();

    function query();

    function exec();

    function select();

    function insert();

    function delete();

    function update();
}
    //mysqli模式数据库连接适配器
    class MysqliAdapter implements IDb {
    
            function connect() {
                //youcode
            }
        
            function query() {
                //youcode
            }
        
            function exec() {
                //youcode
            }
        
            function select() {
                //youcode}
            }
        
            function insert() {
                //youcode}
            }
        
            function delete() {
                //youcode}
            }
        
            function update() {
                //youcode}
            }
    
    }
    
    //pdo模式数据库连接适配器
    class PdoAdapter implements IDb {
    
        function connect() {
            //youcode
        }
        
        function query() {
            //youcode
        }
        
        function exec() {
            //youcode
        }
        
        function select() {
            //youcode}
        }
        
        function insert() {
            //youcode}
        }
        
        function delete() {
            //youcode}
        }
        
        function update() {
            //youcode}
        }
        
    }
    //你自己的业务逻辑
    class Business {
    
        public $db;
    
        public function __construct() {
            $this->dbFactory('pdo');
        }
        //你自己的方法
        function business() {
            $sql = "SELECT * FRROM user WHERE nickname = 'mgckid' ";
            $result = $this->db->select($sql);
            return $result;
        }
        
        //数据库工厂方法(勉强称之为)
        private function dbFactory($dbtype) {
            switch ($dbtype) {
                case 'mysqli':
                    $this->db = new MysqliAdapter();
                    break;
                case 'pdo':
                    $this->db = new PdoAdapter();
                    break;
            }
        }
    
    }
    
    
    //获取结果
   $business = new business();
   $data = $business->business();

    

mgckid
90 声望3 粉丝