从零开始学设计模式(六):适配器模式(Adapter Pattern)

简介: 前面的几篇文章分别介绍了设计模式中的创建型设计模式,它们分别是:

前言


前面的几篇文章分别介绍了设计模式中的创建型设计模式,它们分别是:


单例模式(从零开始学设计模式(二):单例模式):保证整个系统中一个类只有一个实例,并且提供一个访问该实例的全局访问点,实现这种功能的方式就叫单例模式;


原型模式(从零开始学设计模式(三):原型模式(Prototype Pattern)):使用原型实例指定创建对象的种类,并且通过拷贝原型对象创建新的对象。原型模式实际上就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节;


工厂模式(从零开始学设计模式(四):工厂模式(Factory Pattern)):提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。应用最广的地方就是jdk中以及Spring和Struts框架中。而工厂模式又有三种简单工厂模式、工厂方法模式以及抽象工厂模式;


建造者模式(从零开始学设计模式(五):建造者模式(Builder Pattern)):将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示;


接下来将继续学习设计模式中的结构型设计模式。结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。


由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。


学习的第一个结构型模式就是适配器模式(Adapter Pattern)。


定义


适配器模式(Adapter Pattern)指的是把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。就好比你的苹果手机和安卓手机的耳机接口是不一样的,所以如果换了手机那么还得换耳机,但是可以通过一个转换接口能够使得一个耳机在安卓和苹果手机上都能够使用。所以适配器模式也是使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。


适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。


组成部分


通过上面对于适配器模式的介绍,能够总结出适配器模式应该需要有三个部分:


目标(Target):这就是所期待得到的接口,也就是这类的接口是符合我们要求的。


源(Adapee):我们要使用的接口,但是这个接口不符合我们的要求,也就是现在需要适配的接口。


适配器(Adaper):适配器类是适配器模式的核心。适配器把源接口转换成目标接口。所以它不可以是接口,而必须是具体类。


类适配器模式


/**
 * @Author: 江夏
 * @Date: 2021/10/30/18:32
 * @Description:源 要使用的接口
 */
public class Adaptee {
    public void adapteeConnectMethod(){
        System.out.println("这里是源");
    }
}
复制代码


/**
 * @Author: 江夏
 * @Date: 2021/10/30/18:31
 * @Description:目标,期待的接口
 */
public interface Target {
    public void connectMethod();
}
复制代码


定义一个适配器类,继承想要使用的类,并且实现目标接口。


/**
 * @Author: 江夏
 * @Date: 2021/10/30/18:34
 * @Description: 适配器
 */
public class Adapter extends Adaptee implements Target{
    @Override
    public void connectMethod() {
        super.adapteeConnectMethod();
    }
}
复制代码


接口就完成了计划,测试代码如下:


/**
 * @Author: 江夏
 * @Date: 2021/10/30/18:35
 * @Description:类适配器测试代码
 */
public class ClassAdapterTest {
    public static void main(String[] args) {
        Target adapter = new Adapter();
        adapter.connectMethod();
    }
}
复制代码


运行结果如下:


580ef7f7c2834a4a8064067a45b939ee~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


对象适配器模式


适配器类关联已有的Adaptee类,并且实现标准接口,这样做的好处是不再需要继承。


/**
 * @Author: 江夏
 * @Date: 2021/10/30/18:42
 * @Description:对象适配器模式
 */
public class Adapter1 implements Target{
    private Adaptee adaptee;
    public Adapter1 (Adaptee adaptee) {
        this.adaptee= adaptee;
    }
    @Override
    public void connectMethod() {
        this.adaptee.adapteeConnectMethod();
    }
}
复制代码


测试代码:


/**
 * @Author: 江夏
 * @Date: 2021/10/30/18:44
 * @Description:对象适配器模式测试代码
 */
public class AdapterTest {
    public static void main(String[] args) {
        Target adapter = new Adapter1(new Adaptee());
        adapter.connectMethod();
    }
}
复制代码


可以发现运行结果与上面一致:


68a8f57d1d534363a76db48b820a8281~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


可以发现对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。


适配器模式优点


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


系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。


在实现适配器功能的时候,可以自由调用自己开发的功能,从而自然地扩展系统的功能。


类适配器模式优点


由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。


对象适配器模式优点


一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。


适配器模式缺点


过多的使用适配器,会增加系统的复杂性,比如,明明看到调用的是A接口,但是内部却被适配成了B接口的实现。所以适配器模式不适合在详细设计阶段使用它,它是作为一种补偿模式,专用来在系统后期扩展、修改时所用。


类适配器模式的缺点


对于不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。


对象适配器模式的缺点


与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。


适用场景


通过分析适配器模式的特点,可以得到适配器模式适用于以下场景:


1、系统需要使用现有的类,而这些类的接口不符合系统的需要。


2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

目录
相关文章
|
9天前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
8天前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
8天前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
2月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
|
3月前
|
设计模式 Go 数据处理
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
|
3月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 适配器模式
js设计模式【详解】—— 适配器模式
26 0
|
4月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
6天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
21天前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
13天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。