转载请标明出处:
http://blog.csdn.net/qq_34707744/article/details/79196911
本文出自:【生平少年】
维基百科
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
我的理解:2017年新出的macbook pro为例,没有usb接口,而我如果向把我的U盘连接我我的mac,需要花几百块钱买一个转换器。此时,macbook pro上的 usb-c 接口就是我们需要适配的类、接口或者对象,简称 src(source),最终转换的USB接口就是我们需要的输出,简称 dst (destination,即Target)。那么,这个转换器就是一个适配器(Adapter)。
结构
对象适配器模式
适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
类适配器模式
这种适配器模式下,适配器继承自已实现的类(一般多重继承。
接口的适配器模式(缺省适配器模式)
当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。
以 macbook Pro 接口为例:
src 类(macbook pro的 usb-c 接口):
//macbook pro 上的 usb-c 接口
class MacBookProUSBC {
public String usbc() {
String src = "usb-c";
System.out.println("我是" + src + "接口");
return src;
}
}
dst接口(我所需要的输出)
//dst接口(U盘的usb接口)
interface UpanUSB {
String usb();
}
客户端(我的U盘)
//Client类(我的U盘)
class Upan {
//转换接口
public void charging(UpanUSB upanUSB) {
if (upanUSB.usb() == "USB") {
System.out.println("接口是USB接口,开始传输数据");
} else {
System.out.println("接口不是USB接口,无法传输数据");
}
}
}
类适配器模式
通过继承来实现适配器功能。
即,Adapter类通过继承 src 类,实现 dst 类接口,完成 src 到 dst 的适配。
类适配器
//我买的转换器,先继承 src类即MacbookPro,用来实现输出dst类即U盘接口
class ClassAdapter extends MacBookProUSBC implements UpanUSB {
@Override
public String usb() {
String src = usbc();
System.out.println("适配器开始转换接口");
String dst = "";
// ...... 开始业务逻辑
dst = "USB";
System.out.println("适配器开始转换后的接口" + dst);
return dst;
}
}
测试
System.out.println("===============类适配器==============");
UPan upan = new UPan();
upan.charging(new ClassAdapter());
对象适配器模式(常用)
通过组合来实现适配器功能。
即,持有 src 类,实现 dst 类接口,完成 src 到 dst 的适配。
对象适配器
class ObjectAdapter implements UpanUSB {
private MacBookProUSBC myMacBookProUSBC;
public ObjectAdapter(MacBookProUSBC macBookProUSBC) {
myMacBookProUSBC = macBookProUSBC;
}
@Override
public String usb() {
String dst = "";
if (null != myMacBookProUSBC) {
String src = myMacBookProUSBC.usbc();
System.out.println("适配器开始转换接口");
// ...... 开始业务逻辑
dst = "USB";
System.out.println("适配器开始转换后的接口" + dst);
}
return dst;
}
}
测试
//对象适配器
System.out.println("\n===============对象适配器==============");
ObjectAdapter objectAdapter = new ObjectAdapter(new MacBookProUSBC());
Upan upan = new Upan();
upan.charging(objectAdapter);
比较
内容 | 类适配器模式 | 对象适配器模式 |
---|---|---|
原理 | 通过继承来实现适配器功能 | 通过组合来实现适配器功能 |
优点 | 重写src类,Adapter更灵活 | 成本更低,更灵活 |
缺点 | dst必须是接口,有一定局限性 | 逻辑复杂 |
使用场景 | 1.需要间接访问不符合现有接口规范的类中的方法。2.适配其他没有提供合适接口的类,可被多处访问) | 同左 |