php 适配器模式的学习笔记

适配器模式许多和php程序员都没有碰到关于适配器的应用了,这里小编整理了两个关于适配器的使用例子,下面我们就一起来看看吧,希望各位有帮助。

【目的】:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作

【主要角色】

目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的

源(Adaptee)角色:需要进行适配的接口

适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类

【适用性】

1、你想使用一个已经存在的类,而它的接口不符合你的需求

2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作

3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器)

  1. //目标角色
  2. interface Target {
  3. public function simpleMethod1();
  4. public function simpleMethod2();
  5. }
  6. //源角色
  7. class Adaptee {
  8. public function simpleMethod1(){
  9. echo 'Adapter simpleMethod1'."<br>";
  10. }
  11. }
  12. //类适配器角色
  13. class Adapter implements Target {
  14. private $adaptee;
  15. function __construct(Adaptee $adaptee) {
  16. $this->adaptee = $adaptee;
  17. }
  18. //委派调用Adaptee的sampleMethod1方法
  19. public function simpleMethod1(){
  20. echo $this->adaptee->simpleMethod1();
  21. }
  22. public function simpleMethod2(){
  23. echo 'Adapter simpleMethod2'."<br>";
  24. }
  25. }
  26. //客户端
  27. class Client {
  28. public static function main() {
  29. $adaptee = new Adaptee();
  30. $adapter = new Adapter($adaptee);
  31. $adapter->simpleMethod1();
  32. $adapter->simpleMethod2();
  33. } //phpfensi.com
  34. }
  35. Client::main();

【运行结果】

Adapter simpleMethod1

Adapter simpleMethod2

例子2:生活中最常见到的足球换人机制:

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. */
  5. //-------------抽象接口---------------
  6. /**抽象运动员
  7. * Interface IPlayer
  8. */
  9. interface SoccerPlayer
  10. {
  11. function Attack();
  12. function Defense();
  13. }
  14. /**前锋
  15. * Class Forward
  16. */
  17. class Forward implements SoccerPlayer
  18. {
  19. function Attack()
  20. {
  21. echo "前锋攻击<br/>";
  22. }
  23. function Defense()
  24. {
  25. echo "前锋防御<br/>";
  26. }
  27. }
  28. /**中锋
  29. * Class Center
  30. */
  31. class Center implements SoccerPlayer
  32. {
  33. function Attack()
  34. {
  35. echo "中锋攻击<br/>";
  36. }
  37. function Defense()
  38. {
  39. echo "中锋防御<br/>";
  40. }
  41. }
  42. //--------------待适配对象-----------
  43. /**梅西 刚进入罢赛的运动员
  44. * Class Yaoming
  45. */
  46. class Messi
  47. {
  48. function 进攻()
  49. {
  50. echo "梅西进攻<br/>";
  51. }
  52. function 防御()
  53. {
  54. echo "梅西防御<br/>";
  55. }
  56. }
  57. //------------适配器--------------
  58. /**适配器
  59. * Class Adapter
  60. */
  61. class Adapter implements SoccerPlayer
  62. {
  63. private $_player;
  64. //phpfensi.com
  65. function __construct()
  66. {
  67. $this->_player=new Messi();
  68. }
  69. function Attack()
  70. {
  71. $this->_player->进攻();
  72. }
  73. function Defense()
  74. {
  75. $this->_player->防御();
  76. }
  77. }
  78. //测试如下:
  79. $player1=new Forward();
  80. echo "前锋上场:<br/>";
  81. $player1->Attack();
  82. $player1->Defense();
  83. echo "<hr/><br/>";
  84. echo "梅西上场:<br/>";
  85. $Messi=new Adapter();
  86. $Messi->Attack();
  87. $Messi->Defense();