简介

场景

  • 现实场景:国内电压是 220v,外国部分国家是 110v,如果去出差,会需要携带两个电源适配器,以应对这两种不同的电压。
  • 数据库场景:每种编程语言都需要支持多种数据库,通常会抽象一层数据库连接层,例如 Java 的 JDBC,PHP 的 PDO。数据库连接层对应用开发人员提供标准接口,屏蔽了数据库底层的差异。数据库提供的接口则是千差万别的。所以,数据库连接层又拆分为两层,一层对外提供服务,一层用于连接不同的数据库。
  • 具体代码场景:想使用一个已经完成的类,但是它的接口不符合需求。

假设已经有可以提供服务的目标类,客户类访问目标类时,发现其提供的接口不满足需求。此时在客户类和目标类中间加一层抽象,使不能直接交互的类可以一起工作。

定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。

模式定义

将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。

模式特点

适配器模式包含四个角色:

Target:目标抽象类,定义接口标准,客户端可以直接调用
Adapter:适配器类,适配 Adaptee 与 Target,使其可以协同工作
Adaptee:适配者类,需要进行适配的接口
Client:客户类

适配器模式包括两种:

  • 类结构型适配器:继承关系,Adapter 同时继承 Target 和 Adaptee 类。
  • 对象结构型适配器:关联关系,Adapter 继承 Target,关联 Adaptee。

优点

  • 符合“开闭原则”,可以用配置文件方便地更换适配器
  • 解耦,通过引入一个适配器类来重用现有的适配者类

类适配器模式优点:

  • Adapter 是 Adaptee 的子类,因此可以在 Adapter 中置换一些 Adaptee 的方法,使得适配器的灵活性更强。

对象适配器模式优点:

  • 允许一个 Adapter 与多个 Adaptee 同时工作

缺点

类适配器模式的缺点:

  • 对于不支持多继承的语言,一次最多只能适配一个 Adaptee,其使用有一定的局限性,不能将 Adaptee 和它的子类都适配到目标接口。当我们想要匹配一个类以及所有它的子类时,类 Adapter 不能胜任工作。

对象适配器模式的缺点:

  • 重定义 Adaptee 的行为比较困难。

PHP 代码示例

类适配器模式

<?phpinterface Target {public function query();
}class Adapter extends Adaptee implements Target {public function del() {echo "can not delete<br/>";}
}class Adaptee {public function query() {echo "Adaptee query<br/>";}
}class Client {public function test() {$adapter = new Adapter();$adapter->query();$adapter->del();}
}$c = new Client();
$c->test();

输出:

Adaptee query
can not delete

对象适配器模式

<?phpinterface Target {public function query();
}class Adapter implements Target {private $adaptee;public function __construct(Adaptee $adaptee) {$this->adaptee = $adaptee;}public function query() {echo $this->adaptee->query();}public function del() {echo "can not delete<br/>";}
}class Adaptee {public function query() {echo "Adaptee query<br/>";}
}class Client {public function test() {$adaptee = new Adaptee();$adapter = new Adapter($adaptee);$adapter->query();$adapter->del();}
}$c = new Client();
$c->test();

输出:

Adaptee query
can not delete

转载于:https://www.cnblogs.com/kika/p/10851563.html

设计模式 - 适配器模式相关推荐

  1. Python设计模式-适配器模式

    Python设计模式-适配器模式 基于Python3.5.2,代码如下 #coding:utf-8class ACpnStaff:name = ""id = "" ...

  2. Java | 设计模式-适配器模式

    继代理模式后又来到适配器模式啦,想看之前的也有哦.持续更新中哦.让我们一起加油吧兄弟们,干他. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 你好,如果喜欢,请一起坚持!! ...

  3. java设计模式适配器模式_Java中的适配器设计模式

    java设计模式适配器模式 适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码. 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比. 在设计一 ...

  4. 设计模式适配器模式_适配器设计模式示例

    设计模式适配器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要 ...

  5. 设计模式适配器模式_21世纪的设计模式:适配器模式

    设计模式适配器模式 这是我的演讲的第三部分," 21世纪的设计模式" . 适配器模式桥接世界. 在一个世界中,我们有一个概念的界面. 在另一个世界,我们有不同的界面. 这两个接口有 ...

  6. java设计模式适配器模式_Java解释器设计模式

    java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...

  7. Java代码审计-设计模式-适配器模式

    Java设计模式-适配器模式(Adapter Pattern) 目录 什么是适配器模式 适配器模式的3种类型 JavaSE适配器模式的应用 Struts2适配器模式的应用 适配器模式是一种" ...

  8. 【设计模式】Java设计模式 - 适配器模式

    [设计模式]Java设计模式 - 适配器模式

  9. C++设计模式——适配器模式(adapter pattern)

    一.原理讲解 适配器模式别名为包装器(wrapper),分为类适配器(通过多继承实现).对象适配器(组合方式实现),由于类适配器比较少用,本文主要讲解用的比较多的对象适配器. 1.1意图 将一个类的接 ...

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

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

最新文章

  1. VXLAN和GRE的区别
  2. RSA大会播报 – 2014最佳安全博客提名
  3. 画Series的散点图
  4. ubuntu笔记:查看Ubuntu的包依赖关系
  5. linux nfs建立共享目录,linux下nfs磁盘共享目录
  6. ASP.NET Core微服务(一)——【完整API搭建及访问过程】
  7. Semaphore用法
  8. SHOW INDEX FROM 表名,查看mysql表中有哪些索引
  9. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
  10. leetcode题解56-合并区间
  11. Java之数据库基础理论
  12. 8.5 意境级讲解迁移学习
  13. Bag-of-words模型
  14. ios 添加block 类别_ios block是什么数据类型?
  15. IOS根据经纬度算距离
  16. 2019主流的前端框架
  17. linux gnome3+ibus切换中文输入法
  18. Carson带你学Android:手把手带你深入分析事件分发机制!
  19. 深度学习分析--TextCNN算法原理及分类实现
  20. web网页设计实例作业 网页Dreamweaver设计

热门文章

  1. linux删除libc.so.6
  2. 30分钟带你熟练性能优化的那点儿事儿(案例说明)
  3. Redhat Linux通过RPM安装搭建LAMP环境
  4. CentOS iso镜像文件做本地源
  5. golang辟谣之模板编程
  6. 雷人的调查:荷兰女性的安全意识
  7. Linux下matlab断点调试
  8. 【Python学习系列十五】pandas库DataFrame行列操作使用方法
  9. 机器学习知识点(七)决策树学习算法Java实现
  10. vue中引入jquery