适配器模式-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. 【English Teradata】名称缩写

    日常缩写 [GTM]Teradata Go-to-Market employees [GTS]Teradata Global Technical Support [GSC] [CS&S]Cus ...

  2. day2 and day3 总结-python基础-坚持就是胜利

    今日份快捷键学习,pycharm中按CTRL+ALT+L 自动规范化操作,不过和QQ的快捷键会有冲突,建议更改QQ的 知识点: 1.编码 2.while循环 3.运算符 4.数字int 5.布尔值 6 ...

  3. 【MOS】在不同版本和平台之间进行还原或复制 (文档 ID 1526162.1)--跨版本恢复

    参考链接:http://blog.itpub.net/26736162/viewspace-1549041/

  4. android系统中如何通过程序打开某个AccessibilityService

    android系统中如何通过程序打开某个AccessibilityService(系统辅助服务)? 通常的做法是注册AccessibilityService(辅助服务)后跳转到设置启动服务页面引导用户 ...

  5. redis分页摘抄

    Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注) 分页 要对列表页进行分页,需要知道: ①用户总数 $count ② 页大小 $pageSize:用户自定义 ③ 当前页 ...

  6. Java 通过地址获取经纬度 - 高德地图

    一.添加依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-v ...

  7. Linux后台命令的使用说明

    1)ctrl+Z:停止当前进程 首先先将一个程序运行起来,这个时候如果你需要去干别的事情,需要暂停运行,可以使用ctrl+Z: user@mine:/opt/user/pytorch-gender$ ...

  8. OpenCV——图像处理入门:膨胀与腐蚀、图像模糊、边缘检测

    全部外部依赖项: opencv_aruco341d.lib opencv_bgsegm341d.lib opencv_calib3d341d.lib opencv_bioinspired341d.li ...

  9. linkedin 第三方网站登录(JavaScript SDK)

    官网:https://developer.linkedin.com/docs/oauth2 一.配置LinkedIn应用程序 a.创建一个应用  |  https://www.linkedin.com ...

  10. Java实现动态修改Jar包内文件内容

    import java.io.*; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; ...