• 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设计模式-胖胖的空间

  • 相关阅读:
    洛谷 P2827 蚯蚓(NOIp 提高组2016)
    洛谷 P2822 组合数问题(NOIp 提高组2016)
    洛谷 P2671 求和
    洛谷 P1119 灾后重建
    电子海图开发第二十二篇 web电子海图 历史航迹的展示(共一百篇)
    电子海图开发第二十一篇 web电子海图 监听图标点击事件(共一百篇)
    电子海图开发第二十篇 web电子海图 在电子海图上加载图标(共一百篇)
    物联网时代存储告急 边缘存储如何缓解存储压力?
    国家超算深圳中心计划2年内提升计算能力至少1000倍;图神经网络的生成式预训练论文解读
    轻量型 GPU 应用首选 京东智联云推出 NVIDIA vGPU 实例
  • 原文地址:https://www.cnblogs.com/ddddemo/p/5623395.html
Copyright © 2020-2023  润新知