java设计模式之Adapter适配器模式
java设计模式之Adapter适配器模式
适配器模式是我们开发中非常常见的一种设计模式,有时候我们可能没有注意到,但是其实无意中用到了这种模式。今天就来详细说明一下什么是适配器模式。
1、什么是适配器模式?
在实际生活中,可能存在这样一种情况,5年前买了的一个笔记本电脑和一个单独显示器,笔记本和显示器连接都只支持VGA接口,但是显示器突然坏了买了一个显示器,但是这个显示器只支持HDMI接口连接笔记本,怎么和原来的笔记本匹配上呢,又不想再买个笔记本,于是乎我们网购了一个转换接头,将HDMI转为VGA,这个转换接头就是转换器。
从这个例子中我们可以得出几个关键要素概念:
(1)目标接口target: 新显示器
(2)适配器Adapter:转换接头
(3)被适配者Adaptee 电脑接口
设计模式灵感来源于现实世界,解决问题也类似生活中的问题,适配器模式主要是解决不同接口之间适配问题,有一定开闭原则,这解释适配器模式简单定义。
2.适配器模式代码示例
2.1 旧显示器接口和实现
public interface VGAViewInterface { void view(); } public class VGAView implements VGAViewInterface { @Override public void view() { System.out.println("我VGA接口"); } }
2.2笔记本的接口实现
public class MyComputer { private VGAViewInterface vgaView; public MyComputer(){} public MyComputer(VGAViewInterface vgaView) { this.vgaView = vgaView; } public void setView (VGAViewInterface vgaView){ this.vgaView = vgaView; } public void view() { vgaView.view(); } }
2.3新显示器接口和实现
public interface HDMIViewInterface { void view(); } public class HDMIView implements HDMIViewInterface{ @Override public void view() { System.out.println("我使用转换器将VGA转换为HDMI"); } }
2.4适配器的实现
public class ViewAdapter implements VGAViewInterface{ private HDMIViewInterface hdmiViewInterface; public ViewAdapter(HDMIViewInterface hdmiViewInterface) { this.hdmiViewInterface = hdmiViewInterface; } @Override public void view() { hdmiViewInterface.view(); } }
2.5电脑使用旧显示器或者使用适配器连接新显示器
public static void main(String[] args) { VGAViewInterface oldView = new VGAView(); MyComputer myComputer = new MyComputer(oldView); myComputer.view(); HDMIViewInterface hdmiViewInterface = new HDMIView(); ViewAdapter newView = new ViewAdapter(hdmiViewInterface); myComputer = new MyComputer(newView); myComputer.view(); }
打印结果如下:
我VGA接口
我使用转换器将VGA转换为HDMI
上述例子定义了两个显示器接口和实现,定义了一个接口适配器和笔记本电脑的客户端接口实现,画成UML类图如下:
3 总结
该模式的主要优点如下。
- 客户端通过适配器可以透明地调用目标接口。
- 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
- 在很多业务场景中符合开闭原则。
其缺点是:
- 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。
有人认为讲解设计模式的例子都太简单,看着感觉是那么回事,但是要是真想在项目开发中使用,还真是应用不到。其实我们不必在项目中刻意使用设计模式,而是应该从实际的设计问题出发,看哪个模式能解决我们的问题,就使用哪个模式。不要为了使用模式而使用模式,那样就舍本逐末了,一般情况下,只要遵循一定的设计原则就可以了,设计模式也是根据这些原则被总结出来的,熟悉了这些原则,模式自然而然就有了。