适配器模式将一个类的接口,转换成客户期望的另外的一个接口与。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
如目标接口是二插头,而被适配类是三插头,那么适配器就是三插转二插。
组合方式
package com.immoc.pattern.adapter;
/*
* 三相插座接口
*/
public interface ThreePlugIf {
//使用三相电流供电
public void powerWithThree();
}
package com.immoc.pattern.adapter;
public class GBTwoPlug {
//使用二相电流供电
public void powerWithTwo(){
System.out.println("使用二相电流供电");
}
}
适配器
package com.immoc.pattern.adapter;
/*
* 二相转三相的插座适配器
*/
public class TwoPlugAdapter implements ThreePlugIf {
private GBTwoPlug plug;
public TwoPlugAdapter(GBTwoPlug plug){
this.plug = plug;
}
@Override
public void powerWithThree() {
System.out.println("通过转化");
plug.powerWithTwo();
}
}
package com.immoc.pattern.adapter;
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();
}
}
创建一个三插,一个二插,一个适配器。之后二插转三插。最后调用方法充电
继承方式
package com.immoc.pattern.adapter;
/*
* 采用继承方式的插座适配器
*/
public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf {
@Override
public void powerWithThree() {
System.out.print("借助继承适配器");
this.powerWithTwo();
}
}
可以看到,继承了二插,实现了三插。
外面调用是用三插,可是里面的方法this.powerWithTwo();却调用了二插。这就是一个适配器
怎么调用
package com.immoc.pattern.adapter;
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 ;
three = new TwoPlugAdapterExtends();
nb = new NoteBook(three);
nb.charge();
}
}
可以看到,继承有一定的弊端,如果三插有子类圆孔三插的话,怎么办?只能重新写一个适配器,实现这个子类。