适配器模式

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。–维基百科
适配器模式包含如下角色:

  1. Target(目标抽象类)
  2. Adapter(适配器类)
  3. Adaptee(适配者类)
  4. Client(客户类)

适配器UML类图如下(图片摘自https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html):
https://i-blog.csdnimg.cn/blog_migrate/083ba523ecbd26a09236d5e61db00594.jpeg
生活中时常会有这样的场景,使用的电脑显示屏接口分为VGA、HDMI,有很多显示屏只支持VGA,若使用时需要连接支持VGA的接口的电脑,有一些显示屏只支持HDMI,若使用时只能连接支持HDMI的电脑,那如果用户买了一台只支持VGA接口的显示屏,而电脑只支持HDMI接口,此时只需要购买VGA、HDMI转换器即可,下面通过代码说明.
VgaScreenInterface(VGA屏幕接口):

public interface VgaScreenInterface {
    void vgaSocket();
}

VgaComputer(只支持VGA接口的电脑):

public class VgaComputer implements VgaScreenInterface {
    @Override
    public void vgaSocket() {
        System.out.println("VGA屏幕与VGA电脑已连接");
    }
}

HdmiScreenInterface(HDMI屏幕接口):

public interface HdmiScreenInterface {
    void hdmiSocket();
}

HdmiComputer(只支持HDMI接口的电脑):

public class HdmiComputer implements HdmiScreenInterface {
    @Override
    public void hdmiSocket() {
        System.out.println("Hdmi屏幕已经与电脑连接");
    }
}

此时由于购买的屏幕支持VGA接口,而电脑只支持HMDI接口,只需要通过转换器(适配器)即可:

public class SocketAdapter implements VgaScreenInterface {
    // /获取适配者类的引用
    HdmiScreenInterface hdmiScreenInterface;

    public SocketAdapter(HdmiScreenInterface hdmiScreenInterface) {
        this.hdmiScreenInterface = hdmiScreenInterface;
    }

    @Override
    public void vgaSocket() {
        hdmiScreenInterface.hdmiSocket();
    }
}

User(用户类):

public class User {

    VgaScreenInterface vgaScreenInterface;

    public User setAdapter(VgaScreenInterface vgaScreenInterface) {
        this.vgaScreenInterface = vgaScreenInterface;
        return this;
    }

    public void use(){
        vgaScreenInterface.vgaSocket();
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        HdmiScreenInterface hdmiScreenInterface = new HdmiComputer();
        VgaScreenInterface vgaScreenInterface = new SocketAdapter(hdmiScreenInterface);
        User user = new User();
        user.setAdapter(vgaScreenInterface);
        user.use();
    }
}

以上User为:Client,VgaScreenInterface为:目标抽象类,SocketAdapter为:适配器类,HdmiComputer为:适配者类
适配器具有一下优点:

  1. 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码
  2. 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
  3. 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”

文章参考

  1. https://zh.wikipedia.org/wiki/%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F
  2. https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值