1.简介

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

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

主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

2.

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

目标(Target)角色:定义客户端使用的与特定领域相关的接口,这也就是我们所期待得到的
适配器(Adapter)角色:对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类

// 适配器模式

// 1. 源角色
abstract class Toy{
public abstract function openMonth(); public abstract function closeMonth();
} class Dog extends Toy{ public function openMonth(){
echo "Dog open Mouth\n";
} public function closeMonth(){
echo "Dog close Mouth \n";
}
} class Cat extends Toy{ public function openMonth(){
echo 'Cat open Mouth \n ';
} public function closeMonth(){
echo 'Cat close Mouth\n';
}
} // 2.目标角色:红枣公司
interface RedTarget{ public function doMouthOpen(); public function doMouthClose();
} // 目标角色:绿枣公司
interface GreenTarget{
public function operateMouth( $type = 0 );
} // 3 适配器角色:红枣公司
class RedAdapter implements RedTarget{
private $adaptee; public function __construct( Toy $adaptee ){
$this->adaptee = $adaptee;
} public function doMouthOpen(){
$this->adaptee->openMonth();
} public function doMouthClose(){
$this->adaptee->closeMonth();
}
} // 绿枣公司
class GreenAdapter implements GreenTarget{ private $adaptee; public function __construct(){
$this->adaptee = $adaptee;
} public function operateMouth( $type = 0 ){
if($type){
$this->adaptee->openMouth();
}else {
$this->adaptee->closeMouth();
}
}
} $adaptee_dog = new Dog(); $adapter_red = new RedAdapter( $adaptee_dog ); $adapter_red->doMouthOpen(); $adapter_red->doMouthClose();

笔记:1.开闭原则:一个类创建后,内部不可修改,对外可以扩展。

最新文章

  1. 安装mint的时候提示:Not compatible with your operating system or architecture: fsevents@1.0.11
  2. Android上的事件流操作数据库
  3. PHP中IP地址与整型数字互相转换详解
  4. Android获取手机设备识别码(IMEI)和手机号码
  5. Freebsd 编译内核
  6. error: dst ref refs/heads/zhCN_v0.13.1 receives from more than one src.
  7. 如何实现zs无限期试用
  8. iOS开发tips总结
  9. PC机安装Qt以及QT交叉编译环境 分类: OpenCV ZedBoard shell ubuntu Eye_Detection 2014-11-08 18:57 246人阅读 评论(0) 收藏
  10. Javascript: 截取字符串多出来并用省略号[...]显示
  11. 状态压缩DP------学习小记
  12. Android布局解析,图文(转)
  13. 一天搞定HTML----常用标签01
  14. Python创建容器和集合之源码分析
  15. 没人看系列----css 随笔
  16. Python中的函数定义方法
  17. PowerDesigner下载安装破解
  18. Keras实现VGG16
  19. opencv 图片剪切
  20. leecode第二百零六题(反转链表)

热门文章

  1. BZOJ3747:[POI2015]Kinoman——题解
  2. BZOJ1096:[ZJOI2007]仓库建设——题解
  3. 洛谷3800:Power收集——题解
  4. [Leetcode] Binary tree postorder traversal二叉树后序遍历
  5. JSP页面中的Meta标签详解
  6. Widows与linux关于隐形文件和非隐形文件の对比
  7. iOS-查询数据库-->指定数据表中的当前数据行的总数量
  8. Codeforces Round #340 (Div. 2) D
  9. Android 一些系统参数的获取
  10. 使用shell脚本往文件中加一列