尚硅谷设计模式笔记-适配器模式

Table of Contents generated with DocToc

一、生活中的适配器

每个国家使用的插座标准不同,比如泰国用的是两孔的(欧标),中国用的是三孔的。

我们到泰国旅游时,如果只带了三孔插头,则可以买个多功能转换插头【适配器】,这样就可以使用泰国的两孔插座了。


二、程序中的适配器模式

2.1 基本介绍

  1. 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)
  2. 适配器模式属于结构型模式【并没有产生新的对象】
  3. 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

2.2 工作原理

  1. 适配器模式:将一个类的接口转换成另一种接口。让原本接口不兼容的类可以兼容
  2. 从用户的角度看不到被适配者,是解耦的
  3. 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法
  4. 用户收到反馈结果,感觉只是和目标接口交互,如图


三、类适配器模式

基本介绍:Adapter类,通过继承src类, 实现dst类接口,完成src->dst的适配。

3.1 应用实例

以生活中充电器的例子来讲解适配器,充电器本身相当于Adapter, 220V交流电
相当于src (即被适配者),我们的dst(即 目标)是5V直流电

3.2 类图

我们手机需要5v的直流电,则调用5v直流电的接口,然后使用适配器VoltageAdapter将220v的电压转为5v即可

3.3 java实现

  1. 首先实现220v电压
//被适配类Source
public class Voltage220v {
    public int output220v(){
        int src = 220;
        System.out.println("输出"+src+"伏特");
        return src;
    }
}
  1. 然后创建5v直流电接口
//适配接口
public interface Voltage5v {
    int output5v();
}
  1. 创建适配器类,继承voltage220v,实现voltage5v
//适配器
public class VoltageAdapter extends Voltage220v implements Voltage5v{
    @Override
    public int output5v() {
        int source = output220v();
        int target = source / 44;
        return target;
    }
}
  1. 手机类
public class Phone{
    public void chargiing(Voltage5v voltage5v){
        if(voltage5v.output5v()==5){
            System.out.println("电压为5v,可以充电");
        }
        else{
            System.out.println("电压不合适,不可以充电");
        }
    }
}
  1. 调用:
public class Client {
    public static void main(String[] args) {
        System.out.println("===========类适配器模式===========");
        Phone phone = new Phone();
        //VoltageAdapter相当于充电器
        phone.chargiing(new VoltageAdapter());
    }
}

输出为:

=类适配器模式=
输出220伏特
电压为5v,可以充电

3.4 总结

类适配器模式注意事项和细节

  • Java是单继承机制,所以类适配器需要继承src类这一 点算是一个缺点,因为这要
    求dst必须是接口,有一定局限性;
  • src类 的方法在Adapter中都会暴露出来,也增加了使用的成本。
  • 由于其继承了src类,所以它可以根据需求重写src类的方法, 使得Adapter的灵
    活性增强了。

四、对象适配器

对象适配器模式介绍

  1. 基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类, 而
    是持有src类的实例,以解决兼容性的问题。即:持有src类,实现dst类接口,
    完成src->dst的适配
  2. 根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。
  3. 对象适配器模式是适配器模式常用的一种

只需要改动适配器类VoltageAdapter,将继承改为依赖

//适配器
public class VoltageAdapter implements Voltage5v{
    
    private Voltage220v sourceV;

    public VoltageAdapter(Voltage220v sourceV) {
        this.sourceV = sourceV;
    }

    @Override
    public int output5v() {
        int target = 0;
        if(null != sourceV){
            int source = sourceV.output220v();
        	target = source / 44;
        }
        return target;
    }
}

然后改动Client

public class Client {
    public static void main(String[] args) {
        System.out.println("===========类适配器模式===========");
        Phone phone = new Phone();
        //VoltageAdapter相当于充电器
        phone.chargiing(new VoltageAdapter(new Voltage220v()));
    }
}

五、接口适配器模式

基本介绍:

  1. 一些书籍称为:适配器模式(Default Adapter Pattern)或缺省适配器模式。
  2. 不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接
    口中每个方法提供一一个默认实现(空方法),那么该抽象类的子类可有选择地覆
    盖父类的某些方法来实现需求
  3. 适用于一个接口不想使用其所有的方法的情况。

5.1 类图

我们不需要实现Interface中所有方法,只需要用匿名内部类的方式实现AbstractAdapter中的部分方法即可

5.2 java实现

  1. 基本接口
public interface BaseInterface {
    void operation1();
    void operation2();
    void operation3();
}
  1. 适配器(空实现)
public abstract class AbstractAdapter implements BaseInterface{
    public void operation1() {
        
    }
    
    public void operation2() {

    }
    
    public void operation3() {

    }
}
  1. 使用适配器
public class Client {
    public static void main(String[] args) {
        //匿名内部类重写部分方法
        AbstractAdapter abstractAdapter = new AbstractAdapter(){
            @Override
            public void operation1() {
                System.out.println("重写方法一");
            }
        };
        abstractAdapter.operation1();
    }
}
原文地址:https://www.cnblogs.com/theory/p/13384756.html