目录
笔记本电脑的工作电压大约是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?
答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容。
再例如,读卡器是作为内存卡和笔记本之间的适配器。将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
在软件开发中,有时也存在类似这种不兼容的情况,我们也可以像引入一个电源适配器一样引入一个称之为适配器的角色来协调这些存在不兼容的结构,这种设计方案即为适配器模式,它作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
适配器模式概述
适配器模式的定义如下:
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者方法的集合。
在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器、类适配器、接口适配器。
适配器模式结构与实现
对象适配器
在对象适配器模式中,适配器与适配者之间是关联关系;
在对象适配器模式结构图中包含如下几个角色:
Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
类适配器
在类适配器模式中,适配器与适配者之间是继承(或实现)关系。在java中实现不了,需要多重继承才能实现,类图是这个样子的,当然如果变通一下,Target是接口就可以了。
接口适配器
使用抽象方法
接口适配器的使用场景: 原有接口有很多方法,而我们只需要其中一部分,这是看可以用抽象类来实现该接口,不需要的方法只需要写个空方法(默认实现)就好了,接口目标类去实现自己需要的接口
适用的场景是不想实现原有类的所有方法
具体实现
- 背景:买了一个进口笔记本电脑
- 冲突:笔记本电脑需要的三项电源,和只提供的二项电源冲突
- 解决方案:设置一个适配器二项充电口转化为三项充电口
Target:目标接口,能实现三叉,输出三项供电
public interface ThreePower {
void powerByThree();
}
Adaptee:原有的类,实现二叉
public class TwoPower {
public void powerByTwo(){
System.out.println("提供二叉头");
}
}
对象适配器
public class TwoToThreeAdapter implements ThreePower {
TwoPower twoPower=new TwoPower();
public TwoToThreeAdapter(TwoPower twoPower) {
this.twoPower = twoPower;
}
@Override
public void powerByThree() {
System.out.println("转化为二叉");
twoPower.powerByTwo();
}
}
类适配器
public class TwoToThreeAdapter extends TwoPower implements ThreePower {
@Override
public void powerByThree() {
System.out.println("转化为二叉");
this.powerByTwo();
}
}