若转载教程,请注明出自SW-X框架官方文档!

    1. <?php
    2. /**
    3. * 设计模式之适配器模式
    4. * 场景:接口设计
    5. * 小黄牛
    6. */
    7. header("Content-type: text/html; charset=utf-8");
    8. /**
    9. * 接口 - 数据库
    10. */
    11. interface DataBase{
    12. public function Connect(); // 链接数据库
    13. public function Select(); // 查询操作
    14. }
    15. /**
    16. * 实现两种数据库操作类
    17. */
    18. class Mysql implements DataBase{
    19. public function Connect(){echo '链接Mysql <br/>';} // 链接数据库
    20. public function Select(){echo '查询Mysql <br/>';} // 查询操作
    21. }
    22. class Oracle implements DataBase{
    23. public function Connect(){echo '链接Oracle <br/>';} // 链接数据库
    24. public function Select(){echo '查询Oracle <br/>';} // 查询操作
    25. }
    26. /**
    27. * 实现适配器 - 使用组件切换的模式,达到适配效果
    28. * 注意:适配器也应该继承与 对应适配类的接口
    29. */
    30. class Adapter implements DataBase{
    31. private $DataBase; // 数据库操作的实例 - 也就是组件操作的实例
    32. public function __construct($DataBase){
    33. $this->DataBase = $DataBase;
    34. }
    35. # 根据适配器调用对应的方法
    36. public function Connect(){$this->DataBase->Connect();}
    37. public function Select(){$this->DataBase->Select();}
    38. }
    39. # 实例化适配器,并传入Mysql组件
    40. $obj = new Adapter(new Mysql());
    41. $obj->Connect();
    42. $obj->Select();
    43. # 实例化适配器,并传入Oracle组件
    44. $obj = new Adapter(new Oracle());
    45. $obj->Connect();
    46. $obj->Select();

    浏览器输出

    1. 链接Mysql
    2. 查询Mysql
    3. 链接Oracle
    4. 查询Oracle

    适配器模式

    1. 待适配(ForeignPlayer)角色:此角色的接口规则内部的接口规则不一致,但内部需要调用该角色的方法功能。
    2. 内部接口(IPlayer)角色:这是一个抽象角色,此角色给出内部期待的接口规则。
    3. 适配器(Adapter)角色:通过在内部包装一个Adapter对象,把待适配接口转换成目标接口,此角色为适配器模式的核心角色,也是适配器模式所解决问题的关键。

    使用场景

    1. 数据库实例切换
    2. 接口的版本更新

    打个非常容易理解的比喻:

    1. 假设MysqlOracle 都是 DataBase 教出来的徒弟,所以他们会的功夫都是一样的,但两人在招式的领悟上多少有些不同;而Apapter是他们两人的大师兄,所以在境界上,他们两人会的东西,Apapter也一样会。当你拿着Mysql的实例去问Apapter的时候,他就能够耍出跟Mysql一样功夫,所以在实际应用中,你只需要访问Apapter,并将MysqlOracle的实例给他,Apapter就能给你实现两者之间定义的方法。