Java设计模式(02--适配器模式)
Posted zplogo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式(02--适配器模式)相关的知识,希望对你有一定的参考价值。
定义:适配器模式将一个类的接口,转换成客户期望的目标接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式如下图所示,有4个角色构成,客户端、目标接口、适配器类Adapter、被适配类Adaptee。
适配器模式实现方式分为组合实现方式(对象适配器)和继承实现方式(类适配器)
对象适配器实现方式:把被适配类Adaptee作为对象通过适配器类Adapter构造方法传入,Adapter实现目标接口,修改目标接口(在具体实现方法中调用Adaptee对象的方法),这样就可以得到目标接口的对象。
类适配器实现方式:适配器类Adapter extends(继承) Adaptee类 implements(实现) 目标接口(Target interface),在目标接口实现方法中,用this调用父类(adaptee)的方法。
组合模式:就是把被适配类作为一个对象组合到适配器类中,修改目标接口方法。
其步骤:被适配器类通过适配器类构造方法传入作为其成员变量,Adapter实现目标Target接口,修改目标接口
方法,客户端类通过Adapter类生成目标接口对象,有目标接口对象客户端就可以调用其他方法。
(上图应该是单继承不兼容接口, Java是单继承的)
只要是把不兼容,不匹配的装换为兼容的,我们都称之为适配器。适配器有很多变体如下图所示。
实例:演示对象适配器和类适配器
场景:我们有个笔记本(客户端)需要充电,但我们现在只有两相插座Adaptee,我们需要三相插座,因此我们需要用适配器Adapter把两相插头供电Adaptee转化为三相插头供电Target。
三相插头供电接口(Target interface) ThreePlugIf
package com.imooc.pattern.adapter; /** * @author zplogo * 三相插头接口 */ public interface ThreePlugIf { //使用三相电流供电 public void powerWithThreePlug(); }
目前存在的两相插头供电类(Adaptee) GBTwoPlug
package com.imooc.pattern.adapter; /** * @author zplogo * 国标二相电流插头 */ public class GBTwoPlug { //使用二相电流供电 public void powerWithTwo(){ System.out.println("使用二相电流供电"); } }
组合的方式实现适配器(Adapter) TwoPlugAdapter
package com.imooc.pattern.adapter; /** * @author zplogo * 这个类完成了实现目标接口,同时把被适配类组合到目标接口方法中 */ public class TwoPlugAdapter implements ThreePlugIf { private GBTwoPlug gbTwoPlug; public TwoPlugAdapter(GBTwoPlug twoPlug) { this.gbTwoPlug = twoPlug; } //重写实现接口的方法,把二相的供电能力包装成三相供电能力 public void powerWithThreePlug() { System.out.println("通过转换"); gbTwoPlug.powerWithTwo(); } }
继承的方式实现适配器(Adapter) TwoPlugAdapterExtends
package com.imooc.pattern.adapter; /** * @author zplogo * 继承的方式实现适配器模式 */ public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf { public void powerWithThreePlug() { System.out.print("通过继承适配器类实现 "); this.powerWithTwo(); } }
客户端类(Client) NoteBook
package com.imooc.pattern.adapter; /** * @author zplogo * 1)笔记本应该有三相插头这个属性,调用充电这个动作方法即可充电 * 2)获得三相插头对象,需要由实现其接口的适配器类生成,适配器类需要修改其接口方法, * 把二相插头插头的供电能力融合到三相供电方法中。 */ public class NoteBook { private ThreePlugIf threePlugIf; public NoteBook(ThreePlugIf plug){ this.threePlugIf = plug; } public void charge(){ threePlugIf.powerWithThreePlug(); } public static void main(String[] args) { GBTwoPlug gbTwoPlug = new GBTwoPlug(); ThreePlugIf threePlug = new TwoPlugAdapter(gbTwoPlug); NoteBook noteBook = new NoteBook(threePlug); noteBook.charge(); //通过继承的方式实现适配器 threePlug = new TwoPlugAdapterExtends(); noteBook = new NoteBook(threePlug); noteBook.charge(); } }
以上是关于Java设计模式(02--适配器模式)的主要内容,如果未能解决你的问题,请参考以下文章