• 适配器模式:一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。一个类(a)通过某种方式转换成另一个类(b)。
  • 装饰器模式:原有的不能满足现有的需求,对原有的进行增强。一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b)。
  • 代理模式:同一个类而去调用另一个类的方法,不对这个方法进行直接操作。一个类(a)转换成具体的操作类(b)。

1、适配器模式

特点:兼容,不修改源对象,创建一个新接口适配源接口。

  1. /**
  2. * 期待得到的接口
  3. */
  4. interface Target {
  5. //两孔插头
  6. public function TwoHolelink();
  7. }
  8. /**
  9. * 现有的插头
  10. */
  11. class SocketApi {
  12. //三孔插头
  13. public function ThreeHolelink(){
  14. return "连接三孔插头";
  15. }
  16. }
  17. /**
  18. * 适配器
  19. */
  20. class SocketApiImpl extends SocketApi implements Target{
  21. //适配器两孔转三孔
  22. public function TwoHolelink(){
  23. echo "这是两孔转三孔转换头";
  24. return this.ThreeHolelink();
  25. }
  26. }

2、代理模式

特点:隔离,外部不直接访问实际调用对象,如权限控制、切换主题源。

  1. /**
  2. * 主题
  3. */
  4. interface Subject
  5. {
  6. public function operate();
  7. }
  8. /**
  9. * 主题实现
  10. */
  11. class RealSubject implements Subject
  12. {
  13. public function operate()
  14. {
  15. echo "具体实现";
  16. }
  17. }
  18. /**
  19. * 静态代理
  20. */
  21. public class Proxy implements Subject
  22. {
  23. private static subject = null;
  24. public function operate()
  25. {
  26. if(self::subject == null){
  27. self::subject = new RealSubject();
  28. }
  29. echo "代理正在连接";
  30. self::subject.operate();
  31. }
  32. }

2、装饰模式

特点:拓展,源功能无法满足,增加实现功能。必须要有被装饰的类和装饰的类。

  1. /**
  2. * 被装饰者
  3. */
  4. abstract class Component {
  5. public abstract function operation();
  6. }
  7. /**
  8. * 被装饰者具体实现
  9. */
  10. class ConcreteComponent extends Component {
  11. public void operation() {
  12. echo "生产一台车";
  13. }
  14. }
  15. /**
  16. * 装饰器
  17. */
  18. abstract class Decorator extends Component {
  19. private component = null;
  20. //通过构造函数传递被修饰者
  21. public Decorator(Component component) {
  22. this.component = component;
  23. }
  24. //执行装饰
  25. public void operation() {
  26. this.component.operation();
  27. echo "喷成红色";
  28. }
  29. }