适配器模式-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();
}
}
类关系图如下所示: