适配器模式-Adapter

是作为两个不兼容的接口之间的桥梁.

本篇文章的代码github地址: https://github.com/GoldArowana/design-patterns/tree/master/src/main/java/com/king/patterns/adapter

先演示一下不使用适配器时的情况

情景就是家里有插座, 电脑有充电器, 充电器不适用适配器, 直接插到插座上进行充电.

  

Charger接口

这个世界上有很多的充电器(Charger), 但是抽象出来的话, 都有以下两个功能:

1. 充电(charge)

2. 插在插座上(setElectricSocket)

public interface Charger {
public void charge();
public void setElectricSocket(ElectricSocket electricSocket);
}

ElectricSocket接口

这个世界上有很多不同的插座, 但是抽象出来的话, 都是用来供电的

public interface ElectricSocket {
void supplylEctricity();
}

TwoPlugsCharger类

是一种两片插头的充电器. 如图所示:

public class TwoPlugsCharger implements Charger {

    private ElectricSocket electricSocket;

    @Override
public void setElectricSocket(ElectricSocket electricSocket) {
this.electricSocket = electricSocket;
} @Override
public void charge() {
System.out.println("使用[两片]插头充电器");
electricSocket.supplylEctricity();
}
}

TwoPlugsElectricSocket类

是一种两片插孔的插座, 如图所示:

public class TwoPlugsElectricSocket implements ElectricSocket {
@Override
public void supplylEctricity() {
System.out.println("使用[两片]插座供电");
}
}

Computer类

public class Computer {
private Charger charger; public void setCharger(Charger charger) {
this.charger = charger;
} public void startingUp() {
charger.charge();
}
}

People类

People有电脑, 有充电器, 还可能需要充电器的适配器(适配器之后再提).

我的充电器是两插片的充电器.

public class People {
private Computer computer;
private Charger charger;
private ElectricSocketAdapter adapter; public People() {
this.computer = new Computer();
this.charger = new TwoPlugsCharger();
} /**
* 如果需要适配器, 那就在这里设置
*/
public void setAdapter(ElectricSocketAdapter adapter) {
this.adapter = adapter;
} /**
* @param src 电源, 相对于对于充电器来说
*/
public void connect(ElectricSocket src) {
computer.setCharger(charger);
if (adapter == null) {
System.out.println("不需要适配器");
charger.setElectricSocket(src);
} else {
adapter.setElectricSocket(src);
charger.setElectricSocket(adapter);
}
} /**
* 使用电脑, 开机
*/
public void useComputer() {
this.computer.startingUp();
}
}

MyHome类

本来用于运行测试.

MyHome代表我家, 假设场景是我家只有一个"两片插口的插座",

在People类里也提到过, 我的充电器也正好是"两插片"的.

所以我的充电器可以在我家直接使用.

代码如下:

public class MyHome {
/**
* 我家只有两片插口的插座
*/
private static final ElectricSocket ELECTRIC_SOCKET = new TwoPlugsElectricSocket(); public static void main(String[] args) {
// 这个People是我
People me = new People(); // 我把电脑连接在我家的插座上
me.connect(ELECTRIC_SOCKET); // 然后就可以用啦
me.useComputer();
}
}

接下来演示一下使用适配器时的情况

还是笔记本充电器这个例子.

只是有一天去了Hotel, 然后Hotel里的插座全都是三片插座. 我的"两片插头"的充电器无法直接进行使用.如下如所示:

于是乎, 就搞来了一个适配器, 这个适配器的一头可以插进"三片插座"里, 另一头有"两片插孔"

这样就可以让充电器先插到适配器上, 再把适配器插到三片插座就好了.

ThreePlugsElectricSocket类

三片插座, 如下图所示:

public class ThreePlugsElectricSocket implements ElectricSocket {
@Override
public void supplylEctricity() {
System.out.println("使用[三片]插座供电");
}
}

ElectricSocketAdapter类

之前的两片插头的充电器想要使用上面的三片插座来供电的话, 需要一个中间转换器来进行适配. 那就是适配器了.

这里把适配器抽象为一个借口, 代码如下:

public interface ElectricSocketAdapter extends ElectricSocket {
@Override
void supplylEctricity();
void setElectricSocket(ElectricSocket electricSocket);
}

TwoPlugsAdapterToThree类

这是一个适配器的实现, 用于适配: 两片插头->三片插座

public class TwoPlugsAdapterToThree implements ElectricSocketAdapter {
private ElectricSocket electricSocket; @Override
public void setElectricSocket(ElectricSocket electricSocket) {
this.electricSocket = electricSocket;
} @Override
public void supplylEctricity() {
System.out.println("适配器负责将[两片]转为[三片]");
electricSocket.supplylEctricity();
}
}

Hotel类

本来用于运行测试

public class Hotel {
/**
* Hotel只有三片插座
*/
private static final ElectricSocket ELECTRIC_SOCKET = new ThreePlugsElectricSocket(); public static void main(String[] args) {
// 这是我
People me = new People(); // 我提前带上了一个适配器
ElectricSocketAdapter adapter = new TwoPlugsAdapterToThree(); // 装备好适配器
me.setAdapter(adapter); // 连接充电器等各种线
me.connect(ELECTRIC_SOCKET); // 开始使用电脑
me.useComputer();
}
}

类关系图如下所示:

适配器模式-Adapter(Java实现)的更多相关文章

  1. 适配器模式/adapter模式/结构型模式

    定义 将类的接口转化为客户端希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作,别名Wrapper(包装器). 适配器模式,最终改变一个已有对象的接口. 使用场景 当有那么个类, ...

  2. 设计模式(三)-- 适配器模式(Adapter)

    适配器模式(Adapter) 考虑一个记录日志的应用,由于用户对日志记录的要求很高,使得开发人员不能简单地采用一些已有的日志工具或日志框架来满足用户的要求,而需要按照用户的要求重新开发新的日志管理系统 ...

  3. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  4. 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

    适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...

  5. 适配器模式Adapter

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11401410.html 1. 定义将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接 ...

  6. 设计模式系列之适配器模式(Adapter Pattern)——不兼容结构的协调

    模式概述 模式定义 模式结构图 模式伪代码 类适配器,双向适配器,缺省适配器 类适配器 双向适配器 缺省适配器 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 主要缺点 适 ...

  7. 二十四种设计模式:适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...

  8. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  9. 设计模式(五)适配器模式Adapter(结构型)

      设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...

随机推荐

  1. Java 集合系列(三)—— LinkedList

    以脑图的形式来展示Java集合知识,让零碎知识点形成体系 LinkedList    LinkedList是一种可以在任何位置进行高效地插入和删除操作的有序序列.   它的最基本存储结构是一个节点:每 ...

  2. Bootstrap -- 网格系统、排版样式类、 <blockquote>、 <abbr> 元素

    Bootstrap -- 网格系统.排版样式类. <blockquote>. <abbr> 元素 1. Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏 ...

  3. LeetCode算法题-Employee Importance(Java实现)

    这是悦乐书的第291次更新,第309篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第159题(顺位题号是690).定义员工信息的数据结构,其中包括员工的唯一ID,他的重要 ...

  4. 使用PlanViz进行ABAP CDS性能分析

    如管理学学者彼得·德鲁克所说:你无法管理你不能衡量的东西( If you can't measure it, you can't manage it).要对已有程序进行性能优化,首先要对它的运行状况做 ...

  5. 如何解决代码中if…else 过多的问题

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  6. localStorage和sessionStorage数据存储

    var arr=[]; for(var i=0;i<4;i++){ arr[i]=i+i; } console.log(arr.toString()); //将json数据转化为字符串 var ...

  7. vmware centos7 minimal 配置共享文件夹

    使用的是VMware安装CentOS7 minimal版,系统镜像是CentOS-7-x86_64-DVD-1708.iso. 宿主机系统为win10,CentOS7 minimal过程省略,可参考h ...

  8. day 9~11 函数

    今日内容 '''函数四个组成部分函数名:保存的是函数的地址,是调用函数的依据函数体:就是执行特定功能的代码块函数返回值:代码块执行的结果反馈函数参数:完成功能需要的条件信息​1.函数的概念2.函数的定 ...

  9. 【Git】+安装+使用+配置

    Git安装及使用: https://www.cnblogs.com/ximiaomiao/p/7140456.html Git下载地址: http://git-scm.com/download/win ...

  10. Web前端知识点记录

    一.HTML的加载顺序 浏览器边下载HTML,边解析HTML代码,二者是从上往下同步进行的 先解析<head>中的代码,在<head>中遇到了<script>标签, ...