一、对象适配器模式

  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、使用成本更低,更灵活。

 

posted on 2021-01-17 17:31  格物致知_Tony  阅读(346)  评论(0编辑  收藏  举报