设计模式之适配器模式(Java实现)

简介: 设计模式之适配器模式(Java实现)

一、认识适配器模式


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


适配器模式分为两种:类适配器模式、对象适配器模式,通常我们使用后者。


类适配器模式:对应适配器继承适配者,由于Java是单继承所以一般不使用类适配器模式会具有局限性。

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

缺点:对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。

对象适配器模式:在适配器的构造器中添加适配者的参数,在使用适配器时传入适配者,就能够做到灵活使用。

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

缺点:与类适配器模式相比,要想置换适配者类的方法就不容易。

总体优缺点:


优点:通过适配器能够透明的调用目标接口;复用现存的类,程序员不需要修改原有代码而重用现在的适配者,在许多业务中符合开闭原则。

缺点:适配器编写过程中需要结合业务场景来考虑,会增加系统的复杂性;增加代码阅读难度,降低代码可读性。

包含角色:目标接口、适配者类、适配器类。


应用场景:


以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。

使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

UML图如下:分别是继承(类适配器)与组合(对象适配器)的关系





二、实现适配器模式


2.1、类适配器与对象适配器模式


见adapter目录下代码:



需求说明:现在我有个电脑,有一个网线,但是电脑上的网线口与现在网线口不一致,此时我们需要一个适配器,通过使用适配器来连接网线实现上网!


适配者(网线):Reticle


//网线
public class Reticle {
    public void request(){
        System.out.println("插上网线上网");
    }
}


适配器接口:NetToUSB


//适配器接口
public interface NetToUSB {
    //作用:处理请求 将网线=>USB
    void handleRequest();
}


使用者(电脑):Computer


public class Computer {
    //进行上网
    public void net(NetToUSB adapter){
        //调用适配器的方法
        adapter.handleRequest();
    }
}


通过传入适配器(可以说接上)就能够使用网线了,使用网线的具体操作交由适配器完成。

现在就差一个具体适配器了,有了适配器我们就能够上网!!!


类适配器模式


具体适配器:Adapter


//类适配器实现
public class Adapter extends Reticle implements NetToUSB{
    @Override
    public void handleRequest() {
        super.request();
    }
}


实现适配器接口,并且继承网线,在实现方法中调用网线的连接操作。

测试代码:测试类Customer


public class Customer {
    //①测试继承方式的适配器
    public static void main(String[] args) {
        Computer computer = new Computer();//电脑
        Reticle reticle = new Reticle();//网线
        NetToUSB adapter = new Adapter();//适配器
        computer.net(adapter);
    }




问题说明:该适配器通过继承网线的方式来进行调用方法,这种就有弊端了,若是下次需要适配不同的连接线岂不是需要添加其他的适配器类(实现适配器接口)嘛,这样的话系统会变得更加复杂了。由于Java中是单继承,所以这个适配器仅仅只能服务于所继承的适配者。



对象适配器模式


具体适配器:Adapter2


//对象适配器实现
public class Adapter2 implements NetToUSB{
    private Reticle reticle;
    //传入指定的适配者
    public Adapter2(Reticle reticle){
        this.reticle = reticle;
    }
    @Override
    public void handleRequest() {
        reticle.request();
    }
}


对象适配器的话就是传入指定的适配者,在适配方法中调用适配者的方法即可!

测试代码:测试类Customer


//②测试组合方式的适配器
@Test
public void test01(){
    Computer computer = new Computer();//电脑
    Reticle reticle = new Reticle();//网线
    //将网线传入到适配器中(组合方式)
    NetToUSB adapter = new Adapter2(reticle);
    computer.net(adapter);
}



说明:通过使用对象适配器,能够将多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。



总结


1、通过使用适配器模式能够将一些原来老系统的接口通过适配器来使用到我们的新系统上去,类似于我们生活中的转接器。


2、适配器模式有两种方式:类适配器模式(适配器继承适配者方式)、对象适配器模式(适配器组合适配者方式)。建议使用对象适配器模式

相关文章
|
4天前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
20天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
1月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
36 4
|
2月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
52 0
[Java]23种设计模式
|
1月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 Java
Java设计模式
Java设计模式
33 0
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
|
6天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
36 6
|
21天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
19天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
下一篇
DataWorks