适配器模式-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. Centos7上安装docker (转)

    Centos7上安装docker Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如 ...

  2. Java中console类的简单用法

    Java.io.Console 只能用在标准输入.输出流未被重定向的原始控制台中使用,在 Eclipse 或者其他 IDE 的控制台是用不了的. import java.io.Console; pub ...

  3. 如何让EasyUI的Tree或者ComboTree节点不显示图标?

    版本:jQuery EasyUI 1.3.2 通过测试,只需把节点的state属性设置为null即可使EasyUI的Tree或者ComboTree控件的节点不显示图标.

  4. 虚拟机配置Linux上网环境

    概要:在虚拟机安装CentOS6.5的环境后,配置NAT模式,修改系统文件支持上网. (1)ip地址的配置,IP地址的子网掩码为255.255.255.0. (2)网关的指定,也就是默认路由,当我们需 ...

  5. css实现单行(多行)文本溢出显示 ...

    overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 当然还需要加宽度width属来兼容部分浏览. 以上为单行文本溢出===== ...

  6. Docker(3):Dockerfile配置详解

    FROM  : 指定base镜像 MAINTAINER :设置镜像的作者,可以是任意的字符串 COPY :将文件从build context 复制到镜像   COPY 支持两种形式:COPY src ...

  7. php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】

    本文实例总结了php常用数组array函数.分享给大家供大家参考,具体如下: array_combine 功能:用一个数组的值作为新数组的键名,另一个数组的值作为新数组的值 案例: <?php ...

  8. 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤

    1.插入贴膜卡和sim卡:进入“设置—电话—sim卡应用程序”选择CDMA电信解锁: 2.越狱设备,添加cydia.gpplte.com源,安装“6S/6/5S/5C/5电信新补丁”: 3.打卡gpp ...

  9. C语言的3种参数传递方式

    参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有3种方式 值传递 地址传递 引用传递 tips: 被调用函数的形参只有函数被调用时 ...

  10. HttpServletRequest get

    假设客户端请求的地址:http://localhost:8082/TestReq/MyServlet/username=李雷&age=20 request.getRequestURL http ...