适配器模式很常用的;商城中的例子比如快递发货,那么多种快递公司;可能每个快递公司的接口对接都不一样都要适配;比如各种框架中的类似以下思想的代码,都是为了适配。

public function behaviors(){return array_merge(parent::behaviors(), ['login' => ['class' => LoginBehavior::className(),],]);}

适配器出现的原因:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

整个适配链的角色:

①目标角色:也就是我们希望得到的数据结构。

②源角色:需要进行适配的接口 (比如顺丰、中通、蜂鸟等他们的接口的数据结构都不一样;我们如果想要接通他们在我们平台可以使用;那就需要与他们对接后,把数据结构统一!)

③适配器:其实就相当与一个工具类,把源改造成 目标

哪些场景适合使用适配器呢?

1.你想使用一个已存在的类;但是它的数据结构已经不能满足你的需求了2.或者说你想复用一个类(因为此类可能封装了很多底层的东西,你不清楚但也不敢改动),这是可以创建一个新类 拓展类3.你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器)

1、类适配器

//目标角色 接口类
interface ITarget
{  function operation1();  function operation2();
}  //源角色   接口类
interface IAdaptee
{  function operation1();
}  //源角色 实现 源接口类
class Adaptee implements IAdaptee
{  public  function operation1()  {  echo "原方法";  }
}  //适配器角色 (把源改造成我们想要的)
class Adapter extends Adaptee implements IAdaptee, ITarget
{  public  function operation2()  {  echo "适配方法";  }
}  //我们想要的数据;看=》目标角色 接口类 就可以知道我们需要的是2个方法
class Client
{  public  function test()  {  $adapter = new Adapter();  $adapter->operation1();//原方法  $adapter->operation2();//适配方法  }
}

2.对象适配器

//目标角色
interface ITarget
{  function operation1();  function operation2();
}
//源角色
interface IAdaptee
{  function operation1();
}  class Adaptee implements IAdaptee
{  public  function operation1()  {  echo "原方法";  }
}  //适配器角色  (这样的代码是否可以优化?如果ITarget目标接口类想要N个方法呢?在这里都一个一个写上?)
class Adapter implements ITarget
{  private $adaptee;   public function __construct($adaptee)  {  $this->adaptee = $adaptee;  }  public  function operation1()  {  return $this->adaptee->operation1();  }  public  function operation2()  {  echo "适配方法";  }  }  class Client
{  public  function test()  {  $adapter = new Adapter(new Adaptee(null));  $adapter->operation1();//原方法  $adapter->operation2();//适配方法  }
}

可以看出对象适配器比类适配器灵活一点的,但是还可以优化,比如使用php的__call方法;

//改造前
class Adapter implements ITarget
{  private $adaptee;   public function __construct($adaptee)  {  $this->adaptee = $adaptee;  }  public  function operation1()  {  return $this->adaptee->operation1();  }  public  function operation2()  {  echo "适配方法";  }  ....N个方法
}  //改造后
class Adapter implements ITarget
{  private $adaptee;   public function __construct($adaptee)  {  $this->adaptee = $adaptee;  }  //当实例化调用不存在的方法是 自动调用public function __call($func, $args)
{  if (is_callable(array($this->adaptee, $func))) {  return $this->adaptee->$func($args);  }  trigger_error('*********', E_USER_ERROR);
}}  

设计模式--适配器模式 (类适配器和对象适配器)相关推荐

  1. 【设计模式】适配器模式 ( 类适配器代码模板 | 对象适配器代码模板 | 适配器模式示例 )

    文章目录 I . 适配器模式 ( 类适配器 ) 代码模板 II . 适配器模式 ( 对象适配器 ) 代码模板 III . 适配器模式 代码示例 I . 适配器模式 ( 类适配器 ) 代码模板 1 . ...

  2. 适配器模式(类适配器,对象适配器,接口适配器)

    现实生活中的适配器例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器) ,这样就可以使用了. 基本介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一 ...

  3. 适配器模式之类适配器与对象适配器的区别及代码实现

    什么是适配器模式? 适配器模式(Adapter):直观理解就是使原来不能一起相互工作(接口不兼容)的两个功能通过Adapter兼容在一起. 类适配器和对象适配器 类适配器 Adapter 类继承Ada ...

  4. C++设计模式——适配器模式(对象适配器、类适配器)

    http://blog.jobbole.com/109381/?winzoom=1 前言 现在的笔记本都只存在USB接口,用来口,电脑上存在的是USB接口,两者如何通信呢?可以使用USB转串口线连接电 ...

  5. 【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )

    文章目录 I . 适配器模式概念 II . 适配器模式 适用场景 III . 适配器模式 优缺点 IV . 适配器模式 与 外观模式对比 V . 适配器模式 相关角色 ( 重点 ) VI . 适配器模 ...

  6. 趣谈设计模式 | 适配器模式(Adapter):如何让现存对象适用于新的环境?

    文章目录 案例:数据线转换器 适配器模式 "补偿"模式 总结 完整代码与文档 案例:数据线转换器 相信对于安卓用户,曾经或多或少都有着因为接口不适配而带来的苦恼.当你在更换手机时, ...

  7. 双向适配器 java_类适配器,双向适配器

    不兼容结构的协调--适配器模式(三) 类适配器 除了对象适配器模式之外,适配器模式还有一种形式,那就是类适配器模式,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模 ...

  8. [Head First设计模式]身边的设计模式——适配器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  9. 最常用的设计模式---适配器模式(C++实现)

    适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式). 适配器设计模式也并不复杂,适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容 ...

最新文章

  1. add-apt-repository命令详解_Dcr_Hs的博客-CSDN博客_add-apt-repository
  2. AgileEAS.NET平台开发指南-实现插件
  3. 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来
  4. Spring Boot中验证码实现kaptcha
  5. 扩展模块 php.ini_php相关的配置,PHP动态扩展模块
  6. Chapter1-1_Speech_Recognition(Overview)
  7. qr分解求线性方程组_计算方法/数值分析第三章 线性方程组的数值解法
  8. 操作系统之文件管理:1、初识文件管理
  9. 浙江财经大学是一所怎样的学校?
  10. HDU2072 单词数【水题】
  11. 浅谈虚拟桌面上线推广的最佳时机
  12. NO.1 根据数组元素之和,获取对应索引
  13. (源代码)用Python制作疫情的实时数据地图(PS:全国以及每个省)
  14. “狗屁不通”文章生成器网页版代码
  15. 介绍几款在线脑图和流程图制作工具
  16. 【常识】流程图绘制教程
  17. Stanford University courses of computer science department(斯坦福计算机系课程设置)
  18. 连锁不平衡:linkage disequilibrium
  19. 中国人口趋势(1990-2035)
  20. 「UG/NX」CAP工具箱自动安装NX方法教程

热门文章

  1. amd同步多线程_首次同步多线程!AMD第三代锐龙3 3300X/3100上市:4核心8线程、PCIe 4加持...
  2. IAR常用快捷键设置
  3. HTML编写2进制转换计算器,jQuery实现可以计算进制转换的计算器
  4. jenkins——凭据管理
  5. 《Py机器学习》-广义线性模型
  6. ppt里插入html页面,在powerpoint2007中插入网页的方法
  7. 母亲骑摩托4千里回家看儿子 为保险女扮男装
  8. InfiniBand带宽知多少,一幅图表让你明白什么是QDR、FDR10、FDR EDR......
  9. HTML期末大作业课程设计动漫主题html5网页~奇恩动漫首页html模板(HTML+CSS)~个人设计web前端大作业
  10. 最新全自动建站神器系统/宝塔建站系统源码