适配器模式-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(); } }
类关系图如下所示:
---------------------------------------------------------
学如不及,犹恐失之
学如不及,犹恐失之