结构型模式-适配器模式

Posted vbirdbest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式-适配器模式相关的知识,希望对你有一定的参考价值。

一:定义

将一个类的接口转换成客户希望的另外一个接口,使得原来由于接口不兼容而不能一起工作的那些类能一起工作。

适配器Adapter包含的主要角色

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。标准的交流电源插头。
  • 适配者(Adaptoo)类:它是被访问和适配器的现存组件库中的组件接口。欧洲墙视插座。
  • 适配器(Adapter)类:它是一个转换器,通过继承或者引用适配者对象,把适配者接口转成目标接口,让客户按目标接口的格式访问适配器。交流电适配器。

二:类适配器模式

我们的电脑只能读取SD卡,现在我们有一张TF卡也需要使用电脑读取出来。此时我们就需要增加一个适配器来适配TF卡。

适配者:SD卡。

/**
 * 适配者
 */
public interface SDCard 
    String readSD();
    void writeSD(String msg);


public class SDCardImpl implements SDCard 
    @Override
    public String readSD() 
        return "read sd card";
    

    @Override
    public void writeSD(String msg) 
        System.out.println("write msg to sd card");
    

目标:TF卡。

public interface TFCard 
    String readTF();
    void writeTF(String msg);



public class TFCardImpl implements TFCard 
    @Override
    public String readTF() 
        return "read tf card";
    

    @Override
    public void writeTF(String msg) 
        System.out.println("write msg to tf card");
    

适配器类:需要继承目标实现类TFCardImpl,并且实现适配者接口SDCard。内部实现最终还是调用的是目标实现类的方法。

public class TF2SDCardAdapter extends TFCardImpl implements SDCard 
    @Override
    public String readSD() 
        return this.readTF();
    

    @Override
    public void writeSD(String msg) 
        this.writeTF(msg);
    

电脑Computer

public class Computer 
    public String readSD(SDCard sdCard) 
        return sdCard.readSD();
    

Client

public class Client 
    public static void main(String[] args) 
        Computer computer = new Computer();
        String sdCardMsg = computer.readSD(new SDCardImpl());
        System.out.println(sdCardMsg);

        // 读取TF卡
        String tfCardMsg = computer.readSD(new TF2SDCardAdapter());
        System.out.println(tfCardMsg);
    

三:对象适配器模式

类适配器模式 TF2SDCardAdapter extends TFCardImpl 需要继承目标实现类,java是单继承的,如果继承了目标实现类那么适配器类就不能再继承其它类了,这是类适配器不好的地方。

对象适配器模式可以采用将现有组件库中的已经实现的组件引入适配类中,该类同时实现当前系统的业务接口。

对象适配器模式不需要继承,只需要将目标对象引入作为属性即可。

public class TFToSDCardAdapter implements SDCard 
	// 目标接口
    private TFCard tfCard;
	// 只提供一个有参构造函数
    public TFToSDCardAdapter(TFCard tfCard) 
        this.tfCard = tfCard;
    

    @Override
    public String readSD() 
        return tfCard.readTF();
    

    @Override
    public void writeSD(String msg) 
        tfCard.writeTF(msg);
    

Client

public class Client 
    public static void main(String[] args) 
        Computer computer = new Computer();
        String sdCardMsg = computer.readSD(new SDCardImpl());
        System.out.println(sdCardMsg);

        // 读取TF卡
        String tfCardMsg = computer.readSD(new TFToSDCardAdapter(new TFCardImpl()));
        System.out.println(tfCardMsg);
    

四:应用场景

  • 以前开发的系统存在满足新系统功能需求的接口,但其接口同新系统的接口不一致,需要转换一下。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

五:适配器模式简介

适配器模式其实就是对目标对象的一种包装,然后暴露出来统一的方法签名而已。

以上是关于结构型模式-适配器模式的主要内容,如果未能解决你的问题,请参考以下文章

适配器案例

适配器案例

php23种设计模式

结构型模式-适配器模式

Python 设计模式:适配器模式

设计模式:学习笔记(10)——适配器模式