PHP 实现适配器(Adapter)模式

    适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)--适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。

 

    以下示例,用接近伪码的 PHP 语法,演示了一个数据库操作的适配器类,它可以操作 MySQL 和 Oracle 数据库,但使用了相同的方法。由于使用了适配器(Adapter)模式,我们不必关心 MySQL 和 Oracle 数据库操作类的不同。

 

    我们还可以方便的添加进 SQLite 等数据库操作的类,“插入”适配器中,立即就可以用操作 MySQL 和 Oracle 相同的方法来操作 SQLite 数据库了。

 

    //适配器类:
    //定义了4个操作所有数据库的方法
    class Db_adapter
    {
      private $db;

      function __construct($db_obj)
      {
        $this->db = $db_obj;
      }

      function select_record()
      {
        $this->db->select();
      }

      function insert_record()
      {
        $this->db->insert();
      }

      function update_record()
      {
        $this->db->update();
      }

      function delete_record()
      {
        $this->db->delete();
      }
    }

    //MySQL 数据库操作类:
    class Mysql
    {
      private $obj_mysql;

      function __construct()
      {
        $obj_mysql = ......;
      }

      function select()
      {
        $obj_mysql->mysql_select();
      }

      function insert()
      {
        $obj_mysql->mysql_insert();
      }

      function update()
      {
        $obj_mysql->mysql_update();
      }

      function delete()
      {
        $obj_mysql->mysql_delete();
      }
    }

    //Oracle 数据库操作类:
    class Oracle
    {
      private $obj_oracle;

      function __construct()
      {
        $obj_oracle = ......;
      }

      function select()
      {
        $obj_oracle->oracle_select();
      }

      function insert()
      {
        $obj_oracle->oracle_insert();
      }

      function update()
      {
        $obj_oracle->oracle_update();
      }

      function delete()
      {
        $obj_oracle->oracle_delete();
      }
    }

    //操作 MySQL 数据库:
    $obj = new Db_adapter(new Mysql())
    $obj->select_record();
    $obj->insert_record();
    $obj->update_record();
    $obj->delete_record();

    //操作 Oracle 数据库:
    $obj = new Db_adapter(new Oracle())
    $obj->select_record();
    $obj->insert_record();
    $obj->update_record();
    $obj->delete_record();

    要求:MySQL、Oracle 类,有相同名字、相同个数的方法。方法内部实现了各自的操作数据库的代码。转换就是在这里完成的。

    增加新的数据库操作:构造新的类,有相同名字、相同个数的方法。方法内部实现不被关心(被屏蔽) - 不同的数据库实现不同。

    小缺点:新的类,可能因为疏忽,导致方法名字不合要求、个数不同。
    为了减少出错的可能,可以改进一下。方法就是定义一个接口,作为模板来继承,达到规范化。

    db_adapter 类里的方法,只需要使用 interface db_driver 里函数即可。

    //定义一个接口,
    interface Db_driver
    {
      function select();
      function insert();
      function update();
      function delete();
    }

    数据库操作类,比如 MySQL,Oracle 必须实现 db_driver 接口的同名方法,从而进行了规范。

    class Mysql implements Db_driver
    {
      private $obj_mysql;

      function __construct()
      {
        $obj_mysql = ......;
      }
      …… //这里省略的代码同前边的 MySQL 类
    }

    class Oracle implements Db_driver
    {
      private $obj_oracle;

      function __construct()
      {
        $obj_oracle = ......;
      }
      …… //这里省略的代码同前边的 Oracle 类
    }

    代码测试环境:
    操作系统:Windows Server 2003
    Web服务器:Apache2.2.8
    PHP 版本:5.2.5

    作者:张庆(网眼) 西安 PHP 教育培训中心 2010-8-2
    来自“网眼视界”:http://blog.why100000.com
    作者微博:http://t.qq.com/zhangking
    “十万个为什么”电脑学习网:http://www.why100000.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值