正文

一、定义

适配器模式将一个类的接口(被适配者),转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

要点:

  • 适配器实现了目标接口,并持有被适配者的实例。
  • 适配器使用被适配者的方法,把请求转换成被适配者的一个或多个方法。
  • 客户通过目标接口调用适配器的方法对适配器发出请求。
  • 客户与被适配者是解耦的,一个不知道另一个。
  • 当需要使用一个现有的类而其接口并不符合你的需要时,就使用适配器。

二、实现步骤

1、创建被适配者接口

/**
* 被适配者接口
*/
public interface Adaptee { public void specificRequest();
}

2、创建具体的被适配者,并实现被适配者接口

/**
* 具体的被适配者
*/
public class ConcreteAdaptee implements Adaptee { @Override
public void specificRequest() {
System.out.println("ConcreteAdaptee is doing something...");
}
}

3、创建目标接口

/**
* 目标接口
*/
public interface Target { public void request();
}

4、创建适配器类,并实现目标接口

适配器持有被适配者,并在收到请求时调用被适配者的方法。

/**
* 适配器
*/
public class Adapter implements Target { /**
* 被适配者
*/
Adaptee adaptee; public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
} @Override
public void request() {
// 调用被适配者方法
adaptee.specificRequest();
}
}

5、使用适配器转换被适配者

public class Test {

    public static void main(String[] args) {
// 被适配者
Adaptee adaptee = new ConcreteAdaptee();
// 适配器
Adapter adapter = new Adapter(adaptee);
adapter.request();
}
}

三、举个栗子

1、背景

你上班的公司做了一套模拟鸭子游戏。现在,假设你缺鸭子对象,想用一些火鸡对象来冒充。

显而易见,因为火鸡的接口不同,所以我们不能公然拿来用。

2、实现

使用适配器把火鸡的方法转换成鸭子的方法,这样表面上看起来就像是一只鸭子了。

(1)创建火鸡接口

/**
* 火鸡接口(被适配者)
*/
public interface Turkey { /**
* 咯咯叫
*/
public void gobble(); /**
* 飞行
*/
public void fly();
}

(2)创建具体的火鸡

/**
* 野火鸡
*/
public class WildTurkey implements Turkey { @Override
public void gobble() {
System.out.println("Gobble gobble");
} @Override
public void fly() {
System.out.println("I'm flying a short distance");
}
}

(3)创建鸭子接口

/**
* 鸭子接口(目标接口)
*/
public interface Duck { /**
* 呱呱叫
*/
public void quark(); /**
* 飞行
*/
public void fly();
}

(4)创建火鸡适配器,并实现鸭子接口

/**
* 火鸡适配器
*/
public class TurkeyAdapter implements Duck { /**
* 火鸡
*/
Turkey turkey; public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
} @Override
public void quark() {
turkey.gobble();
} @Override
public void fly() {
// 火鸡飞行距离比鸭子短,因此需要调用5次火鸡的fly()方法。
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}

(5)使用火鸡适配器,将火鸡适配成鸭子

public class Test {

    public static void main(String[] args) {
// 火鸡(被适配者)
Turkey turkey = new WildTurkey();
// 火鸡适配器
TurkeyAdapter turkeyAdapter = new TurkeyAdapter(turkey);
turkeyAdapter.quark();
turkeyAdapter.fly();
}
}

《Head First 设计模式》:适配器模式的更多相关文章

  1. 20. 星际争霸之php设计模式--适配器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. Java设计模式——适配器模式

    JAVA 设计模式 适配器模式 用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器 ...

  3. linkin大话设计模式--适配器模式

    linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...

  4. php设计模式适配器模式

    php设计模式适配器模式 简介 适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起. 其实就是通过一个转换类,这个转 ...

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

    [设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...

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

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

  7. JAVA 设计模式 适配器模式

    用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式是一种结构型模式. 结构

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

    概念: 将一个类的接口,转换成客户期望的另一个接口.适配器模式让原来接口不兼容的类可以在一起工作. 解决的问题: 提供类似于中间人的作用:把原本不兼容.不能一起工作的接口组合在一起,使得它们能够在一起 ...

  9. 24种设计模式--适配器模式【Adapter Pattern】

    今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把 ...

  10. 结合JDK源码看设计模式——适配器模式

    定义: 将一个类的接口转换成客户期望的另外一个接口(重点理解适配的这两个字),使得接口不兼容的类可以一起工作适用场景: 已经存在的类,它的方法和需求不匹配的时候 在软件维护阶段考虑的设计模式 详解 首 ...

随机推荐

  1. 题解 洛谷 P4492 【[HAOI2018]苹果树】

    考虑生成一颗二叉树的过程,加入第一个节点方案数为\(1\),加入第二个节点方案数为\(2\),加入第三个节点方案数为\(3\),发现生成一颗\(n\)个节点的二叉树的方案数为\(n!\). 所以题目中 ...

  2. DataTable 转 JSON,XML转JSON

    今天总结一下关于DataTable,XML转JSON的方法: 首先需要引入命名空间: using Newtonsoft.Json 1 public string DataTableToJsonWith ...

  3. 自已动手作图搞清楚AVL树

    @ 目录 一.背景 二.平衡二分搜索树---AVL树 2.1 AVL树的基本概念 结点 高度 平衡因子 2.2 AVL树的验证 三.旋转操作 3.1 L L--需要通过右旋操作 3.2 R R--需要 ...

  4. Everything搜索表达式

    导出搜索列表为txt或csv ​ 索引最近变化 维持一个额外的按照最近变化排序的系统文件数据库,其可以通过 rc: 搜索,或以最近变化排序. ​ 搜索运行次数大于 100: runcount:> ...

  5. 集合的一些实例的demo实现

    按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 准备牌: 牌可以设计为一个ArrayList,每个字符串为一 ...

  6. sublimeCLang配置报错以及sublime快捷键

    subimeClang需要手动配置我真的真的很服 记录一下满是报错的高光时刻 -------- 不过这个问题刚刚解决了 只要把所有的shared_ptr改成std::shared_ptr 就行 说白了 ...

  7. IDEA解决MAVEN下载插件慢问题

    原文链接:https://blog.csdn.net/qq_25983579/article/details/104398915 使用阿里的maven镜像 右键项目选中maven选项,然后选择“ope ...

  8. pandas_重采样多索引标准差协方差

    # 重采样 多索引 标准差 协方差 import pandas as pd import numpy as np import copy # 设置列对齐 pd.set_option("dis ...

  9. pandas | DataFrame基础运算以及空值填充

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是pandas数据处理专题的第四篇文章,我们一起来聊聊DataFrame中的索引. 上一篇文章当中我们介绍了DataFrame数据结构当 ...

  10. Kylin Flink Cube 引擎的前世今生

    Apache Kylin™ 是一个开源的.分布式的分析型数据仓库,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,它能在亚秒内查询巨大的表. Ky ...