首页 > 代码库 > Java设计模式(02--适配器模式)

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--适配器模式)