Iloveblog 2018-11-01
我们来说下适配器模式。
一、什么是适配器模式
大家在买笔记本电脑时,都会有一个电源适配器,不知道你们注意过没,它叫适配器。为什么不直接一个电源线搞定呢?这就是问题。
我们知道,我们国家使用的是220V的电压,而其他国家中有使用110V电压的,那如果电脑的电源线不用适配器会出现什么情况?我们的电脑因为电压低开不了机。这样,适配器的作用就显示出来了。大家仔细看下电脑的电源适配器,它上面有一个输入电压范围(我的是100V-240V),而输出电压是固定的(我的是19.5V)。这样,就能让我们不管在什么地方,都能正常使用电脑。
所以,什么是适配器模式呢?
就是将一个类的接口转换为客户希望的另外一个接口。适配器模式将原本由于接口不兼容而不能一起工作的那些类可以一起工作。
这也就说明了一点,适配器模式只是一个中间转换器。它主要应用于希望复用一些现存的类,但是接口又与复用环境不一致的情况。
二、适配器模式的结构
我们看下适配器模式的结构图。
在适配器模式中,我们通过增加一个新的适配器类(Adaper类)来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。
根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。
模式所涉及的角色有:
● 目标(Target)角色:定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
● 适配器(Adaper)角色:适配器类是本模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
● 源(Adapee)角色:适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
三、适配器模式使用举例
我们现在的笔记本电脑都是三相电插头,假如我们去了一个地方,只有两相电插座,怎么办?只能用转换头去适配转换了。
原有二相电插座类:
package com.zhaodf.pattern.AdapterPattern; public class TwoPhaseElectricalSocketAperture { public void twoPhaseElectricalSocketCharge(){ System.out.println("使用两相电充电"); } }
我们只有三相电插头(我们的目标接口,对外提供的):
package com.zhaodf.pattern.AdapterPattern; //这是我们的目标接口,因为用户只有三相电插头,我们只能提供三相电充电接口 public interface ThreePhaseElectricalJack { void charge(); }
适配器转换:
package com.zhaodf.pattern.AdapterPattern; //我们的适配器 public class Adapter implements ThreePhaseElectricalJack{ private TwoPhaseElectricalSocketAperture twoPhaseElectricalJack; public Adapter(){ this.twoPhaseElectricalJack = new TwoPhaseElectricalSocketAperture(); } public void charge() { System.out.println("通过转换器进行适配,将三相电插头转换为二相电插头"); twoPhaseElectricalJack.twoPhaseElectricalSocketCharge(); } }
客户端:
package com.zhaodf.pattern.AdapterPattern; public class Client { public static void main(String[] args){ ThreePhaseElectricalJack threePhaseElectricalJack = new Adapter(); threePhaseElectricalJack.charge(); } }
结果:
前几篇介绍了设计模式的特性并且详细讲解了4种创建型模式,创建型模式是负责如何产生对象实例的,接下来讲讲结构型模式。结构型模式是解析类和对象的内部结构和外部组合,通过优化程序结构解决模块之间的耦合问题。