一、对象适配器模式
1、基本思路和类的适配器模式相同,只是将 Adapter 类做修改,不是继承 src 类,而是持有 src 类的实例,以解决兼容性的问题。
即:持有 src 类,实现 dst 类接口,完成 src ->dst 的适配;
2、根据 “合成复用原则” ,在系统中尽量使用关联关系(聚合)来替代继承关系;
3、对象适配器模式是适配器模式常用的一种;
二、对象适配器模式应用实例
1、应用实例说明
以生活中充电器的例子来学习适配器,充电器本身相当于 Adapter, 220V 交流电相当于 src(即被适配器),我们的目的 dst(即目标)是 5V 直流电,使用 对象适配器模式完成。
2、思路分析
3、代码实现
src 类:
1 /**
2 * 被适配的类
3 */
4 public class Voltage220V {
5
6 /**
7 * 输出 220V 的电压
8 * @return
9 */
10 public int output220V() {
11 int src = 220;
12 System.out.println("电压=" + src + "伏");
13 return src;
14 }
15 }
适配接口:
1 /**
2 * 适配接口
3 */
4 public interface IVoltage5V {
5
6 /**
7 * 输出 5V 电压
8 * @return
9 */
10 public int output5V();
11 }
适配器类:
1 /**
2 * 适配器 类
3 */
4 public class VoltageAdapter implements IVoltage5V {
5
6 //关联关系 —— 聚合关系
7 Voltage220V voltage220V;
8
9 //通过构造器传入一个 Voltage220V 实例
10 public VoltageAdapter(Voltage220V voltage220V) {
11 setVoltage220V(voltage220V);
12 }
13
14 public void setVoltage220V(Voltage220V voltage220V) {
15 this.voltage220V = voltage220V;
16 }
17
18
19
20 @Override
21 public int output5V() {
22 int destV = 0;
23 if (null != voltage220V) {
24 //获取到 220V 电压
25 int srcV = voltage220V.output220V();
26 System.out.println("使用对象适配器,进行适配~~~");
27 //降压,转成 5V
28 destV = srcV / 44;
29 }
30 return destV;
31 }
32 }
客户端:
1 public class Phone {
2
3 /**
4 * 充电
5 * @param voltage5V
6 */
7 public void charging(IVoltage5V voltage5V) {
8 if (voltage5V.output5V() == 5) {
9 System.out.println("电压为5伏特,可以充电~~");
10 } else if (voltage5V.output5V() > 5) {
11 System.out.println("电压过高,无法充电~~");
12 }
13 }
14 }
15 ----------------------------------------------------------------
16 /**
17 * 类适配器 测试
18 */
19 public class Client {
20 public static void main(String[] args) {
21 System.out.println("~~~对象适配器模式~~~");
22 Phone phone = new Phone();
23 phone.charging(new VoltageAdapter(new Voltage220V()));
24 }
25 }
三、对象适配器模式
1、对象适配器和类适配器其实算同一种思想,只不过实现方式不同。
根据合成复用原则,使用组合替代继承,所以它解决了类适配器必须继承 src 的局限性问题,也不再要求 dst 必须是接口。
2、使用成本更低,更灵活。