适配器模式-Adapter(Java实现)
适配器模式-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实现)的更多相关文章
- 适配器模式/adapter模式/结构型模式
定义 将类的接口转化为客户端希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作,别名Wrapper(包装器). 适配器模式,最终改变一个已有对象的接口. 使用场景 当有那么个类, ...
- 设计模式(三)-- 适配器模式(Adapter)
适配器模式(Adapter) 考虑一个记录日志的应用,由于用户对日志记录的要求很高,使得开发人员不能简单地采用一些已有的日志工具或日志框架来满足用户的要求,而需要按照用户的要求重新开发新的日志管理系统 ...
- 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)
怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...
- 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释
适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...
- 适配器模式Adapter
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11401410.html 1. 定义将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接 ...
- 设计模式系列之适配器模式(Adapter Pattern)——不兼容结构的协调
模式概述 模式定义 模式结构图 模式伪代码 类适配器,双向适配器,缺省适配器 类适配器 双向适配器 缺省适配器 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 主要缺点 适 ...
- 二十四种设计模式:适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...
- 设计模式 - 适配器模式(adapter pattern) 具体解释
适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...
- 设计模式(五)适配器模式Adapter(结构型)
设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...
随机推荐
- Kafka 安装配置 windows 下
Kafka 安装配置 windows 下 标签(空格分隔): Kafka Kafka 内核部分需要安装jdk, zookeeper. 安装JDK 安装JDK就不需要讲解了,安装完配置下JAVA_HOM ...
- C#基础知识之反射
http://blog.csdn.net/educast/article/details/2894892 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理 ...
- ideal中项目resources下txt文件读取不到的问题。
这次做项目,原来用到了一个txt文件,在ideal中项目启动后报读取不到txt文件.项目原来是在eclipse中的. 在网上找了些文章,发现ideal中要读取到resources下的文件需要加上下面红 ...
- C++笔记-数组指针/二维数组转换指针
参考资料: 1. 作者 BensonLaur :https://www.cnblogs.com/BensonLaur/p/6367077.html 2. https://blog.csdn.net/ ...
- 线性回归和Logistic回归
目录 线性回归 用线性回归模型拟合非线性关系 梯度下降法 最小二乘法 线性回归用于分类(logistic regression,LR) 目标函数 如何求解\(\theta\) LR处理多分类问题 线性 ...
- vue 2.0 + ElementUI构建树形表格
解决: 本来想在网上博客找一找解决方法,奈何百度到的结果都不尽人意,思维逻辑不清,步骤复杂,代码混乱,找了半天也没找到一个满意的,所以干脆就自己动手写一个 思路: table需要的数据是array,所 ...
- Elasticsearch 通关教程(三): 索引别名Aliases问题
业务问题 业务需求是不断变化迭代的,也许我们之前写的某个业务逻辑在下个版本就变化了,我们可能需要修改原来的设计,例如数据库可能需要添加一个字段或删减一个字段,而在搜索中也会发生这件事,即使你认为现在的 ...
- CSL 的魔法
链接 [https://ac.nowcoder.com/acm/contest/551/E] 分析 很显然就是a的第k大得和b的倒数第k大相乘. 那么我们只要让a的第k大和b的倒数第k大位置是相同的即 ...
- HashTable和HashMap
参考自: http://blog.csdn.net/tgxblue/article/details/8479147 HashMap和HashTable的异同: 1 HashMap是非线程安全的,Has ...
- idea下创建maven聚合(子父级)项目,多模块项目
IDEA下Maven多模块项目介绍和搭建 idea 创建maven聚合项目简洁教程(手把手入门,通俗易懂) 本人使用的是: intelj idea 创建聚合项目(典型web项目,包括子项目util.d ...