目录
一、概念
二、UML类图
1、类适配器
2、对象适配器
三、角色设计
四、代码实现
案例一
案例二
五、总结
一、概念
将一个类的接口转换为另一个接口,使得原本由于接口不兼容的类进行兼容。
适配器模式主要分为类适配器模式和对象适配器模式,前者类适配器模式之间的耦合度比后者更高,所以更推荐使用对象适配器。
二、UML类图
1、类适配器
2、对象适配器
三、角色设计
角色 | 描述 |
目标接口(Target) | 客户所期待的接口 |
适配者类(Adaptee) | 它是被访问和适配的现存组件库中的组件接口 |
适配器(Adapter) | 通过包装一个需要适配的对象,把原接口转换为目标接口 |
四、代码实现
案例一
假设一个手机只支持5W的充电功率,如果充电功率大于5W,则不能进行充电,那我们就需要对大于5W的充电功率进行向下兼容适配,以下是代码实现过程。
1、先定义一个5W的目标接口Target
public interface Power5WTarget {public int outPut5W();}
2、这是我们需要适配的类Adaptee
public class Power60WAdaptee {public int outPut60W(){System.out.println("充电功率60W");return 60;}}
3、采用类适配器进行适配
public class ClassAdapter extends Power60WAdaptee implements Power5WTarget {@Overridepublic int outPut5W() {int power = super.outPut60W();return power/12;}}
4、采用对象适配器进行适配
public class ObjAdapter implements Power5WTarget {private Power60WAdaptee power60WAdaptee;public ObjAdapter(Power60WAdaptee power60WAdaptee){this.power60WAdaptee = power60WAdaptee;}@Overridepublic int outPut5W() {int power = this.power60WAdaptee.outPut60W();return power/12;}
}
5、新建一个手机类
public class Phone {public void charging(Power5WTarget power5WTarget) {if(power5WTarget.outPut5W() == 5) {System.out.println("电压符合标准,允许充电!");} else if (power5WTarget.outPut5W() > 5) {System.out.println("电压过大,禁止充电!");}}
}
6、测试
public static void main(String[] args) {Phone phone = new Phone();phone.charging(new ClassAdapter());phone.charging(new ObjAdapter(new Power60WAdaptee()));}
7、运行结果
案例二
假设由如下场景:由一个接口只支持USB接口进行手机充电,现在来了个无线充电的手机也想通过USB进行充电,这边我们就需要为无线充电做一个适配转换。
1、目标接口:客户所期待的Usb接口
public interface UsbTarget {void usb();}
2、要适配的类或适配者类
public class WirelessAdaptee {public void wireless(){System.out.println("无线充电...");}}
3、类适配器:通过包装一个需要适配的对象,把原接口转换成目标接口
public class ClassAdapter extends WirelessAdaptee implements UsbTarget{@Overridepublic void usb() {super.wireless();System.out.println("wireless -> usb");}}
4、对象适配器:通过包装一个需要适配的对象,把原接口转换成目标接口
public class ObjAdapter implements UsbTarget{private WirelessAdaptee wirelessAdaptee;public ObjAdapter(WirelessAdaptee wirelessAdaptee){this.wirelessAdaptee = wirelessAdaptee;}@Overridepublic void usb() {this.wirelessAdaptee.wireless();System.out.println("wireless -> usb");}}
5、测试运行
public static void main(String[] args) {// 类适配器ClassAdapter classAdapter = new ClassAdapter();classAdapter.usb();// 对象适配器ObjAdapter objAdapter = new ObjAdapter(new WirelessAdaptee());objAdapter.usb();}
6、运行结果
五、总结
类适配器和对象适配器区别:
类适配器:单继承,一次最多只能适配一个适配者类
对象适配器:可以把多个不同的适配者适配到同一个目标