模式概述: 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的 那些类可以在一起工作。
模式分类:a.类的适配器模式(采用继承实现)
b.对象适配器(采用对象组合方式实现)
模式要素:。(这里拿变压器来举例说明,便于理解) 家用电压220v.而USB电源为5V电压。
目标: 定义一个客户端使用的特定接口。()
客户: 使用目标接口,与和目标接口一致的对象合作。
被适配器:一个现存需要匹配的接口。(家里220V电源)
适配器:负责将被适配者的接口转换成目标的接口。(电压转换器)
实现步骤:
1.首先家里有个插座提供220V电压。类名:Receptacle(插座)
该插座有个功能。即:提供220V电压
public class Receptacle {
public int provideHomeVoltage() {
System.out.println("有一个插座提供220V电压");
return 220;
}
}
2.定义适配器,这里指变压器,变压器提供转换接口。可转换电压
public interface TransformerAdapter {
//转换电压
public int transformVoltage();
}
public class TransformerDevice implements TransformerAdapter{
Receptacle receptacle;
public Receptacle getReceptacle() {
return receptacle;
}
public void setReceptacle(Receptacle receptacle) {
this.receptacle = receptacle;
}
@Override
public int transformVoltage() {
int volatage=receptacle.provideHomeVoltage();
int lowerVolatage=volatage/44;
System.out.println("转化中电压为="+lowerVolatage+"v");
return lowerVolatage;
}
}
3.5V电源USB 设备
public class USBDevice {
private TransformerAdapter adapter;
public TransformerAdapter getAdapter() {
return adapter;
}
public void setAdapter(TransformerAdapter adapter) {
this.adapter = adapter;
}
//USB输入电压
public void inputVoltage(){
System.out.println("得到输入电压" +adapter.transformVoltage()+"v");
}
}
客户:测试
public static void main(String[] args) {
//定义一个插座
Receptacle re=new Receptacle();
//给插座供电
re.provideHomeVoltage();
//定义变压器
TransformerDevice transformerDevice=new TransformerDevice();
//提供变压器输入电源
transformerDevice.setReceptacle(re);
//USB 5V电压设备
USBDevice usb=new USBDevice();
//USB 连接一个变压器
usb.setAdapter(transformerDevice);
//
usb.inputVoltage();
}
输出:
这样,对象适配器模式就完成啦。
类适配器就是将适配器继承被适配者。
两者的区别有以下几点
1.类适配器模式需要创建自身来创建一个Receptacle
对象适配器模式可以直接使用一个已有的Receptacle的实例来转换接口。
2. 类适配器继承了Adaptee,所以可以通过覆写来扩展provideHomeVoltage();
对象适配器和Adaptee是包含关系不能扩展;(其实也可以扩展的见下面)
3.类适配器模式因为是继承所以相对静态,而对象适配器模式是包含是组合相对灵活(可以通过写Receptacle子类扩展功能)
想了想变压器。在现实中的优缺点。得到如下:
优点:
1.将两个不同接口联系起来。耦合性低。
2.主要将具体实现封装在适配器中.(这个例子里。电源转换输入输出功能主要在变压器中实现,而不是在插座内)
3.灵活性和扩展性都非常好,符合开闭原则
缺点:
1.过多的使用适配器,会使系统非常零乱。
参考:
http://blog.sina.com.cn/s/blog_629b701e0100zajs.html;
http://blog.youkuaiyun.com/jason0539/article/details/22468457
《大话设计模式》