1. 适配器模式简介
适配器模式的结构:
目标(Target)角色:这就是所期待得到的接口,由于这里讨论的是类适配器模式,因此目标不可以是类。
源(Adaptee)角色:被适配的接口(可以是接口或者类)。
适配器(Adapter)角色:适配器类是本模式的核心,适配器把源接口转换成目标接口,显然这一角色不可以是接口,而必须是具体类。
适配器模式有 类的适配器模式 和 对象的适配器模式 两种不同的形式.
2. 适配器模式的实现
以插头和插座来说明适配器模式的用途:
笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本
电脑无法使用,这时候一个三相到两相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。
2.1 使用组合的方式实现插座适配器(对象适配器)
笔记本的插头是三相的,所以应该使用三相插座来供电
public interface ThreePlugIf { //三相插座接口 //使用三相电流供电 public void powerWithThree(); }
但目前没有三相插座,只有二相插座(GB)
public class GBTwoPlug {
//供电方法 public void powerWithTwo(){ System.out.println("使用二相电流供电"); } }
所以作为一个使用三相插头供电的笔记本,想要用电就需要将二相插座转换为三相,适配器就出现了
public class NoteBook { private ThreePlugIf plug; //创建一个三相插座的成员变量 public NoteBook(ThreePlugIf plug){ //笔记本的构造方法 this.plug = plug; } //使用插座充电(笔记本是使用三相插头的) public void charge(){ plug.powerWithThree(); } public static void main(String[] args) { //只有二相的国标插座,没有三相的,这时需要一个将二相插座转换为三相的适配器 GBTwoPlug two=new GBTwoPlug(); ThreePlugIf three=new TwoPlugAdapter(two); //二相转三相 NoteBook nb=new NoteBook(three); nb.charge(); //供电 } }
二相转三相的插座适配器
public class TwoPlugAdapter implements ThreePlugIf { private GBTwoPlug gBTwoPlug; //二相插座 public TwoPlugAdapter(GBTwoPlug gBTwoPlug){ this.gBTwoPlug = gBTwoPlug; } @Override public void powerWithThree() { System.out.println("通过转化"); gBTwoPlug.powerWithTwo(); } }
运行笔记本的main方法可得
对以上过程的分析:
2.2 采用继承的方式实现插座适配器(类适配器)
接上面,要采用继承方式实现插座适配器,需要继承二相,同时实现三相
public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf { @Override public void powerWithThree() { System.out.println("通过继承适配器"); this.powerWithTwo(); } }
笔记本main方法如下
public class NoteBook { private ThreePlugIf plug; //创建一个三相插座的成员变量 public NoteBook(ThreePlugIf plug){ //笔记本的构造方法 this.plug = plug; } //使用插座充电(笔记本是使用三相插头的) public void charge(){ plug.powerWithThree(); } public static void main(String[] args) {
//只有二相的国标插座,没有三相的,这时需要一个将二相插座转换为三相的适配器 ThreePlugIf three = new TwoPlugAdapterExtends(); NoteBook nb = new NoteBook(three); nb.charge(); } }
输出
2.3 两种方法特点:
3. 适配器的作用