本文简单介绍适配器模式
适配器模式-Adapter
概述
- 将一个类的接口转换成客户希望的另外一个接口。
- 原本不兼容的类可以一起工作。
类型:结构型设计模式
适用场景
- 已经存在的类,他的方法和需求不匹配时(方法结果相同或相似)
- 不是软件设计阶段考虑的设计模式,是随着软件维护,不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案
应用实例:
1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。
3、在 LINUX 上运行 WINDOWS 程序。
4、JAVA 中的 jdbc。
关键代码:
适配器继承或依赖(组合)已有的对象,实现想要的目标接口
优点
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。
缺点
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
类适配器
-
coding
被适配类public class Adaptee { public void adapteeMethod(){ System.out.println("被适配者的方法"); } }
目标接口
public interface Target { // 目标方法 void targetMethod(); }
适配器类
public class Adapter extends Adaptee implements Target { @Override public void targetMethod() { System.out.println("相关适配操作...."); super.adapteeMethod(); System.out.println("相关适配操作...."); } }
-
uml
对象适配器
- coding
适配器类
public class Adapter implements Target {
private Adaptee adaptee;
public void setAdaptee(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void targetMethod() {
System.out.println("相关适配操作....");
adaptee.adapteeMethod();
System.out.println("相关适配操作....");
}
}
- uml
实用场景
-
描述:
美国电器 110V,中国 220V,就要有一个适配器将 220V 转化为 110V -
Coding
public class AC220 { public int outputAC220V() { int output = 220; System.out.println("中国输出交流电" + output + "V"); return output; } }
public interface AC110 { int outputAC110V(); }
public class PowerAdapter implements AC110 { private AC220 ac220; public void setAc220(AC220 ac220) { this.ac220 = ac220; } @Override public int outputAC110V() { int adapterInput = ac220.outputAC220V(); //变压器... int adapterOutput = adapterInput / 2; System.out.println("使用PowerAdapter输入AC:" + adapterInput + "V" + "输出AC:" + adapterOutput + "V"); return adapterOutput; } }
测试类
public class Test { public static void main(String[] args) { AC220 ac220 = new AC220(); PowerAdapter powerAdapter = new PowerAdapter(); powerAdapter.setAc220(ac220); powerAdapter.outputAC110V(); } }
-
UML
经典应用
略