zoukankan      html  css  js  c++  java
  • php设计模式- 适配器模式

    概念:适配器模式,将截然不同的函数接口封装成统一的API。实际应用举例,PHP的数据库操作有mysql、mysqli、pdo三种,可以用适配器模式统一。类似的场景还有将memcache、redis、file、apc等不同缓存函数统一成cache适配器。

    适用场景:

    系统要求使用现有的类,而且这些类的接口不符合系统的接口。

    想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

    两个类所做的事情相同或相似,但是具有不同接口。

    旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有的类。

    使用第三方组件,接口定义与我们的定义不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

    主要角色:

    Target(目标角色):定义客户端使用的与特定领域相关的接口,即我们所期待得到的。

    Adaptee(源角色):需要进行适配的接口。

    Adapter(适配器角色):对Adaptee的接口与Target接口进行适配。适配是本模式的核心。适配器把原接口转换成目标接口,此角色为具体类。

    下面是一个数据库适配器代码模型:

    1.Target

    Libs/IDatabase.php

    <?php
    namespace Libs;
    /**
    * Target
    */
    interface IDatabase
    {
        function connect($host,$user,$pwd,$dbname);
        function query($sql);
        function close();
    }


    2.Adapter(对Adaptee进行适配)

    Libs/Database/MySQL.php

    <?php
    namespace LibsDatabase;
    
    use LibsIDatabase;
    class MySQL implements IDatabase
    {
        protected $conn;        
        public function connect($host,$user,$pwd,$dbname)
        {
                    //mysql_connect 是Adaptee
            $conn = mysql_connect($host,$user,$pwd);
            mysql_select_db($dbname);
            $this->conn = $conn;
        }
        public function query($sql)
        {
                    //mysql_query<span style="font-family: Arial, Helvetica, sans-serif;">是Adaptee</span>
    
            $res = mysql_query($sql,$this->conn);
            return $res;
        }
        public function close()
        {
                    //mysql_close 是adaptee
            mysql_close($this->conn);
        }
        
    }

    Libs/Database/MySQLi.php

    <?php
    namespace LibsDatabase;
    
    use LibsIDatabase;
    class MySQLi implements IDatabase
    {
        protected $conn;
        
        public function connect($host,$user,$pwd,$dbname)
        {
            $conn = mysqli_connect($host,$user,$pwd,$dbname);
            $this->conn = $conn;
        }
        public function query($sql)
        {
            $res = mysqli_query($this->conn,$sql);
            return $res;
        }
        public function close()
        {
            mysqli_close($this->conn);
        }
    
    }

    Libs/Database/PDO.php

     <?php
    
    namespace LibsDatabase;
    
    use LibsIDatabase;
    class PDO implements IDatabase
    {
        protected $conn;
    
        public function connect($host,$user,$pwd,$dbname)
        {
            $conn =  new PDO("mysql:host=$host;dbname=$dbname", $user, $pwd);
            $this->conn = $conn;
        }
        public function query($sql)
        {
            return $this->conn->query($sql);     
        }
        public function close()
        {
             unset($this->conn);
        }
    
    }

    3.调用

    $db= new LibsDatabaseMySQL();
    $db->connect('localhost', 'username', 'pwd', 'test');
    $db->query('show databases');
    $db->close();

    推荐阅读:

    设计模式学习笔记-适配器模式

    PHP源码阅读,PHP设计模式-胖胖的空间

  • 相关阅读:
    vmware ubuntu 异常关机无法连接到网络
    Speed up GCC link
    常用的一些解压命令
    Log4j 漏洞复现
    Test Case Design method Boundary value analysis and Equivalence partitioning
    CCA (Citrix Certified Administrator) exam of “Implementing Citrix XenDesktop 4”
    What is Key Word driven Testing?
    SAP AGS面试小结
    腾讯2013终端实习生一面
    指针的引用
  • 原文地址:https://www.cnblogs.com/ddddemo/p/5623395.html
Copyright © 2011-2022 走看看