模式的秘密-适配器模式

适配器模式:

定义:适配器模式将类的接口,转换成客户期望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

把“被适配者”作为一个对象组合到适配器类中,以修改目标接口包装被适配者

  • target:目标接口。   // 下面的三相插头
  • Adapter:适配器。                        //下面的二相适配器
  • adaptee:被适配类。                         //下面的二相插座

实例:

假如现在一台笔记本的插头是三相的,而插座是二相的,为了能给笔记本充电,需要拿一个适配器,这样就能用二相的插座给三相的笔记本充电。

分析:

  • 首先有一个二相插座:GBTowPlug。
  • 还有一个三相插头:ThreePlugIf。
  • 二相插座和三相插头接口之间需要一个适配器:TwoPlugAdapter。
  • 还有一个用三相插头接口充电的笔记本。
  1. 因为三相插头可能插到不同的适配器上去插入不同的插座上,这是多态体现,因此三相插头就设计成一个接口类,适配器继承这个接口,不同的适配器都能继承这个接口
  2. 对于适配器和二相插座来说,一种适配器对应适配一种插座,适配器使用插座。因此这里可以设计成把插座类作为一个变量传入适配器类里面,供适配器去使用
  3. 笔记本要使用适配器,因此可以把适配器传入给笔记本内部,供笔记本类调用

代码编写:

第一步:声明一个三相插头接口:

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,低耦合

将目标类和适配器类解耦,通过引入一个适配器类重用现有的适配者类,而无须修改原有代码(遵循开闭原则)。

原文地址:https://www.cnblogs.com/alsf/p/8491199.html