hudeyong926 发表于 2013-2-7 00:45:58

PHP 实现适配器(Adapter)模式

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

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

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

    //适配器类:
    //定义了4个操作所有数据库的方法
<?phpclass 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 里函数即可。
<?php//定义一个接口,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 类}?>
页: [1]
查看完整版本: PHP 实现适配器(Adapter)模式