从零开始学设计模式(六):适配器模式(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、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

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