适配器模式:
定义:适配器模式将类的接口,转换成客户期望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装被适配者。
- target:目标接口。 // 下面的三相插头
- Adapter:适配器。 //下面的二相适配器
- adaptee:被适配类。 //下面的二相插座
实例:
假如现在一台笔记本的插头是三相的,而插座是二相的,为了能给笔记本充电,需要拿一个适配器,这样就能用二相的插座给三相的笔记本充电。
分析:
- 首先有一个二相插座:GBTowPlug。
- 还有一个三相插头:ThreePlugIf。
- 二相插座和三相插头接口之间需要一个适配器:TwoPlugAdapter。
- 还有一个用三相插头接口充电的笔记本。
- 因为三相插头可能插到不同的适配器上去插入不同的插座上,这是多态体现,因此三相插头就设计成一个接口类,适配器继承这个接口,不同的适配器都能继承这个接口。
- 对于适配器和二相插座来说,一种适配器对应适配一种插座,适配器使用插座。因此这里可以设计成把插座类作为一个变量传入适配器类里面,供适配器去使用。
- 笔记本要使用适配器,因此可以把适配器传入给笔记本内部,供笔记本类调用。
代码编写:
第一步:声明一个三相插头接口:
package com.Adapter; /* * 三相插座接口 * */ public interface ThreePlugIf { //使用三相电流供电 public void powerWithThree(); }
第二步:定义一个二相插头。
package com.Adapter; public class GBTowPlug { //使用二相电流供电 public void powerWithTwo() { System.out.println("使用二相电流供电"); } }
第三步:对于这个三相插头接口,用一个二相插头适配器去实现(继承),但是适配器需要使用二相插头(通过构造方法传入作为变量):
package com.Adapter; /* * 二相转三相的插座的插座适配器 * */ public class TwoPlugAdapter implements ThreePlugIf { private GBTowPlug plug; public TwoPlugAdapter(GBTowPlug plug) { this.plug=plug; } @Override public void powerWithThree() { System.out.println("通过转化"); plug.powerWithTwo();//适配器调用二相插座通电 } }
第四步:定义一个笔记本电脑类:笔记本电脑需要通过适配器去连上二相插座(适配器通过构造方法传入笔记本类),通电。
package com.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) { GBTowPlug two=new GBTowPlug();//二相插座 ThreePlugIf three=new TwoPlugAdapter(two);//二相插座适配器 NoteBook nb=new NoteBook(three);//笔记本 nb.charge(); } }
效果:
通过转化
使用二相电流供电
适配器分类:
1,组合
采用组合的方式的适配器称为对象适配器
特定:把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装被适配者。
2,继承
采用继承方式的称为类适配器。
特定:通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类而实现适配。
通过继承的代码:
加上一个类:
package com.Adapter; //采用继承方式的插座适配器 public class TwoPlugAdapterExtends extends GBTowPlug implements ThreePlugIf { @Override public void powerWithThree() { System.out.println("借助继承适配器"); this.powerWithTwo();//调用自己所继承的powerWithTwo方法 } }
调用:
package com.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) { GBTowPlug two=new GBTowPlug(); ThreePlugIf three=new TwoPlugAdapter(two); NoteBook nb=new NoteBook(three); nb.charge(); three=new TwoPlugAdapterExtends(); nb=new NoteBook(three); nb.charge(); } }
输出:
通过转化
使用二相电流供电
借助继承适配器
使用二相电流供电
适配模式作用:
1,透明
通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。
2,重用
复用了现存的类,解决了现存类和复用环境要求不一致的问他。
3,低耦合
将目标类和适配器类解耦,通过引入一个适配器类重用现有的适配者类,而无须修改原有代码(遵循开闭原则)。