若转载教程,请注明出自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就能给你实现两者之间定义的方法。

免费教程手写不易,希望能支持一下SW-X框架,(^.^)

GitHub有账号的朋友,也可以给我们一个小星星噢!

希望能够与大家共同培育出良好的Swoole生态,对Swoole有兴趣的朋友可以加我微信好友,进入SW-X框架官方交流群。
该群以Swoole生态发展交流为主,若出现争吵,攻击其他人等行为,立即剔除。