本文共 2613 字,大约阅读时间需要 8 分钟。
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
优点:
1. 可以让任何两个没有关联的类一起运行。 2. 提高了类的复用。 3. 增加了类的透明度。 4. 灵活性好。 缺点: 1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2. 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。我们就拿日本电饭煲的例子进行说明,日本电饭煲电源接口标准是110V电压,而中国标准电压接口是220V,所以要想在中国用日本电饭煲,需要一个电源转换器。
我们先定义日本220V电源接口和实现。
110V接口:
/** * 日本110V电源接口 * */public interface JP110VInterface { public void connect();}
110V接口实现:
public class JP110VInterfaceImpl implements JP110VInterface { public void connect() { System.out.println("接通电源,开始工作...."); }}
我们再定义中国220V电源接口和实现。
220V接口:
public interface CN220VInterface { public void connect();}
220V接口实现:
public class CN220VInterfaceImpl implements CN220VInterface { public void connect() { System.out.println("接通电源,开始工作......"); }}
要想在中国使用日本电饭煲,需要把电饭煲110v的电源接口适配成我们220V的电源接口,这就需要一个电源适配器:
/** * 为了能够适配定电饭煲110v电源接口,我们需要继承110v接口 * */public class PowerAdaptor implements JP110VInterface { private CN220VInterface cn220VInterface;//用220V接口进行适配 PowerAdaptor(CN220VInterface cn220VInterface){ this.cn220VInterface=cn220VInterface; } public void connect() { cn220VInterface.connect(); }}
适配器继承的是要适配的接口,并持有对客户的接口的引用。
下面正式开始啦,现在我们有一个日本电饭煲,用的是110v的电源接口:
public class ElectricCooker { private JP110VInterface jp110VInterface;//日本电饭煲,用的是日本110V标准电源接口 ElectricCooker(JP110VInterface jp110VInterface){ this.jp110VInterface=jp110VInterface; } public void cook(){ jp110VInterface.connect();//接通电源 System.out.println("开始做饭......"); }}
电饭煲用的是110V接口
测试类:
public class AdaptorTest { public static void main(String[] args) { CN220VInterface cn220VInterface=new CN220VInterfaceImpl();//中国的220V电源 PowerAdaptor adaptor=new PowerAdaptor(cn220VInterface);//电源适配器 ElectricCooker cooker=new ElectricCooker(adaptor);//使用110V接口的电饭煲 cooker.cook();//使用了适配器,在220V的环境下可以工作啦 }}
适配器继承了110V接口,就可以用于日本电饭煲;适配器又持有220V接口的引用,就可以用220V进行工作。
运行结果:
接通电源,开始工作......开始做饭......