3.适配器模式

【基本介绍】

  适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作,起别名为包装器。主要分为:类适配器模式、对象适配器模式、接口适配器模式。

1.类适配器模式

  案例说明:将220V交流电(src 被适配者)通过充电器(相当于Adapter)转换成5V(dst 目标)。

  Adapter通过继承src类,实现dst类的接口完成 src-》dst的适配。

1 //适配接口
2 public interface IVoltage5V {
3     public int output5V();
4 }
5V电流接口
 1 public class Phone {
 2     //充电
 3     public void charging(IVoltage5V iVoltage5V) {
 4         if(iVoltage5V.output5V() == 5) {
 5             System.out.println("电压为5V, 可以充电~~");
 6         } else if (iVoltage5V.output5V() > 5) {
 7             System.out.println("电压大于5V, 不能充电~~");
 8         }
 9     }
10 }
手机类(接口应为5V)
1 //被适配的类
2 public class Voltage220V {
3     //输出220V的电压
4     public int output220V() {
5         int src = 220;
6         System.out.println("电压=" + src + "伏");
7         return src;
8     }
9 }
22V交流电类
 1 //适配器类
 2 public class VoltageAdapter extends Voltage220V implements IVoltage5V {
 3     @Override
 4     public int output5V() {
 5         // TODO Auto-generated method stub
 6         //获取到220V电压
 7         int srcV = output220V();
 8         int dstV = srcV / 44 ; //转成 5v
 9         return dstV;
10     }
11 }
充电器Adapter
1 public class Client {
2     public static void main(String[] args) {
3         // TODO Auto-generated method stub
4         System.out.println(" === 类适配器模式 ====");
5         Phone phone = new Phone();
6         phone.charging(new VoltageAdapter());
7     }
8 }
开始充电

 2.对象适配器模式

  基本思路和类适配器模式相同,只是将Adapter类做修改,不在继承src(220V)类(使用组合代替继承),而是持有src类的实例(作为成员变量,通过构造器传入),以解决兼容性问题。即 持有src类,实现dst类的接口完成 src-》dst的适配。

 1 //适配器类
 2 public class VoltageAdapter  implements IVoltage5V {
 3 
 4     private Voltage220V voltage220V; // 关联关系-聚合
 5     
 6     //通过构造器,传入一个 Voltage220V 实例
 7     public VoltageAdapter(Voltage220V voltage220v) {
 8         this.voltage220V = voltage220v;
 9     }
10     
11     @Override
12     public int output5V() {
13         int dst = 0;
14         if(null != voltage220V) {
15             int src = voltage220V.output220V();//获取220V 电压
16             System.out.println("使用对象适配器,进行适配~~");
17             dst = src / 44;
18             System.out.println("适配完成,输出的电压为=" + dst);
19         }
20         return dst;
21     }
22 }
适配器
1 public class Client {
2     public static void main(String[] args) {
3         // TODO Auto-generated method stub
4         System.out.println(" === 对象适配器模式 ====");
5         Phone phone = new Phone();
6         phone.charging(new VoltageAdapter(new Voltage220V()));
7     }
8 }
开始充电

3.接口适配器模式

   当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择的覆盖父类的某些方法来实现需求。适用于一个接口不想使用其所有的方法的情况。

1 public interface Interface4 {
2     public void m1();
3     public void m2();
4     public void m3();
5     public void m4();
6 }
接口
 1 //在AbsAdapter 我们将 Interface4 的方法进行默认实现
 2 public abstract class AbsAdapter implements Interface4 {
 3     //默认实现(空方法)
 4     public void m1() {
 5     }
 6     public void m2() {
 7     }
 8     public void m3() {
 9     }
10     public void m4() {
11     }
12 }
抽象类
 1 public class Client {
 2     public static void main(String[] args) {
 3         AbsAdapter absAdapter = new AbsAdapter() {
 4             //只需要去覆盖我们 需要使用 接口方法
 5             @Override
 6             public void m1() {
 7                 // TODO Auto-generated method stub
 8                 System.out.println("使用了m1的方法");
 9             }
10         };
11         absAdapter.m1();
12     }
13 }
测试
原文地址:https://www.cnblogs.com/qmillet/p/12112038.html