Java设计模式 -- 适配器模式

Java设计模式之<适配器模式>  java的设计模式可分为:创建型模式、结构性模式、行为型模式三类。适配器模式(Adapter Pattern)是一种 结构型设计模式,用于在两个不兼容的接口之间建立桥梁,使它们可以协同工作。它通常用于让已有的类与新接口兼容,而无需修改原有代码。实现方式分为对象适配器(基于组合)、类适配器(基于继承)、接口适配器(基于抽象类)三种。 阅读详情

我们先来明确一下 适配器模式有三种,分别是 类适配器模式、对象适配器模式、接口适配器模式。

接下来不打算直接看这些模式的定义以及实例源码,我们直接从问题出发。

假如有如下类

public class ViewController {
    public void getView() {
        System. out.println("This is Original getView() method!" );
    }
}

现在有新的需求,需要转换这个类,如果直接修改这个类可能会带来不必要的风险,那么如何在保持该类不动的情况下转换这个类呢?

方法大体上有两种

  • 其一是 继承(泛化)
  • 其二是 聚合

我们不说上面两种方法有什么优缺点,先来看看如何实现

##类适配器模式

定义接口抽取功能方法

public interface Adapter {
    public void getView();
    public void getCount();
}

接着定义继承类,一并实现该功能接口

public class BaseAdapter extends ViewController implements Adapter {
    @Override
    public void getView() {
        super.getView();
    }

    @Override
    public void getCount() {
        System. out.println("This is Adapter extends ViewController getCount() method!");

    }
}

然后 就可以在 测试用例中体现多态了

public class TestCase {
    public static void main(String[] args) {

        /*
         * Call Adapter Method;
         */

        Adapter adapter = new BaseAdapter();
        adapter.getView();
        adapter.getCount();

    }
}

上面这种解决方式就是设计模式上所说的 类适配器模式.

接下来看看第二种实现方法

对象适配器/装饰器模式

定义一个聚合类

public class Wrapper implements Adapter {
    private ViewController source;

    public Wrapper( final ViewController source ) {
        this.source = source;
    }

    @Override
    public void getView() {
        source.getView();
    }

    @Override
    public void getCount() {
        System. out.println("This is wrapper adapter method!" );
    }
}

构造器 需要传入ViewController 的实例

然后直接看测试用例

public class TestCase {

    public static void main(String[] args) {

        /*
         * Call Original Method;
         */
        ViewController source = new ViewController();
        source.getView();

        /*
         * Call Wrapper Adapter Method;
         */

        Adapter wrapper = new Wrapper(source);
        wrapper.getView();
        wrapper.getCount();

    }
}

这种实现思路在设计模式上叫做 对象适配器模式.

当然 我们也可以将上面的Wrapper类做如下调整

public class Wrapper implements Adapter {

    private ViewController source;

    public Wrapper( final ViewController source ) {
        this.source = source;
    }

    @Override
    public void getView() {
        System. out.println("Before getview() method call, you can do something here before getview method");
        source.getView();
        System. out.println("After getview() method call, you can do something here after getview method");
       
    }

    @Override
    public void getCount() {
        System. out.println("This is wrapper adapter method!" );
    }
}

这个时候我们也可以称之为 装饰器模式, Android中比较常见的装饰器模式是 ContextWrapper 这个类

通过上面这个例子,可能感觉到 装饰器模式和适配器模式 不是一样的吗?干嘛还弄两个设计模式?

其实 装饰模式和适配器模式都有一个别名,就是包装模式,但是这两个模式是很不一样的。适配器模式的用意是要改变所考虑对象的接口,将其转换成所需要的形式,而装饰模式的用意是保持接口,只是为了扩展功能,一个是转换,一个是扩展。

小结一下:
上面两种实现思路 迥然不同 对象适配器可以很好的解决类适配器模式中遇到的兼容问题, 他们俩孰优孰劣 还需视不同的情况区别对待。

接口适配器模式

接下来我们看一下Android中广为人知的Adapter源码:

public interface Adapter {
    
    void registerDataSetObserver(DataSetObserver observer);
    void unregisterDataSetObserver(DataSetObserver observer);
    int getCount();  
    Object getItem(int position);
    long getItemId( int position );
    boolean hasStableIds();
    View getView(int position, View convertView , ViewGroup parent);
    int getItemViewType( int position );
    int getViewTypeCount();
    boolean isEmpty();
}

再看一下它的子接口

public interface SpinnerAdapter extends Adapter {
    
    public View getDropDownView( int position , View convertView, ViewGroup parent);
}

public interface ListAdapter extends Adapter {
    public boolean areAllItemsEnabled();
    boolean isEnabled( int position );
}

接着看它的实现抽象类

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public boolean hasStableIds() {
        return false ;
    }
   
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer );
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer );
    }
   
    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }

    /**
     * Notifies the attached observers that the underlying data is no longer valid
     * or available. Once invoked this adapter is no longer valid and should
     * not report further data set changes.
     */
    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }

    public boolean areAllItemsEnabled() {
        return true ;
    }

    public boolean isEnabled(int position) {
        return true ;
    }

    public View getDropDownView( int position , View convertView, ViewGroup parent) {
        return getView(position , convertView , parent );
    }

    public int getItemViewType(int position) {
        return 0;
    }

    public int getViewTypeCount() {
        return 1;
    }
   
    public boolean isEmpty() {
        return getCount() == 0;
    }
}

看完上面的这个BaseAdapter以后,到这我们可能不知道这个BaseAdapter类究竟有啥作用,继续往下看

public class ScheduleAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Object getItem( int position ) {
        // TODO Auto-generated method stub
        return null ;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView( int position , View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        return null ;
    }
}

这么一个适配器类相信大家都不陌生,从这个类是不是就看出BaseAdapter类的好处了,如果还看不出来,最简单的办法是自己写个Adapter类 不经过BaseAdapter 就会像下面这样

public class ScheduleAdapter implements ListAdapter, SpinnerAdapter {

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
        // TODO Auto-generated method stub
    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {
        // TODO Auto-generated method stub
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Object getItem( int position ) {
        // TODO Auto-generated method stub
        return null ;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return false ;
    }

    @Override
    public View getView( int position , View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        return null ;
    }

    @Override
    public int getItemViewType(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int getViewTypeCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return false ;
    }

    @Override
    public View getDropDownView( int position , View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        return null ;
    }

    @Override
    public boolean areAllItemsEnabled() {
        // TODO Auto-generated method stub
        return false ;
    }

    @Override
    public boolean isEnabled(int position) {
        // TODO Auto-generated method stub
        return false ;
    }
}

是不是原先接口的每个方法都需要一一实现,而大部分接口方法是不需要从新实现一遍的,因此BaseAdapter这个抽象类就充当了中间适配的角色。

上面这个就是设计模式中的接口适配器模式

用一张图形象的表述如下:

此处输入图片的描述

【Java设计模式】Java设计模式之(十七)适配器模式(Adapter Pattern) 这种类型的设计模式属于结构型模式。 一、适配器模式介绍 1.1 含义 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通 阅读详情

相关推荐

工业自动化中气动夹爪选型、调试与维护全流程实战解析

在工业自动化领域,气动执行元件是实现精准抓取与搬运的基础。其工作原理是通过压缩空气驱动气缸,转化为直线或旋转运动,从而控制夹爪的开合。这类技术因其结构简单、响应快速、成本低廉及维护方便,在自动化产线中具有极高的技术价值,是实现高效、可靠物料搬运的核心单元。其典型应用场景涵盖电子装配、汽车制造、食品包装等行业的上下料、分拣与定位工序。本文以工业自动化中常见的二指平行气动夹爪(常被工程师代号化为“Gripper-A”)为例,深入剖析其从硬件选型、气动系统集成到程序逻辑联锁的完整工程实践。内容聚焦于夹持力计算中惯

weixin_42629671的博客 366

Java设计模式—适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式;用于将一个类的接口转换成另一个接口,从而满足客户端对接口的需求;在适配器模式中,适配器充当一个中间层,通过实现目标接口并持有原始类的实例来实现对原始类的封装和转换。客户端只需要调用目标接口中定义的方法即可完成对原始类的调用。适配器模式在Java中广泛应用于各种场景,例如,将旧版API适配到新版API、将不同的数据格式适配到统一的数据格式等。所以,适配器模式是个非常非常重要的,是个非常强的设计模式!

是个非常热爱生活、乐观、奋斗、努力的逗比青年 4067

QGIS中高效处理CAD数据的两种实用技巧

本文详细解析了在QGIS中高效处理CAD数据的两种核心方法。针对DWG/DXF文件在QGIS中直接打开失败的问题,介绍了使用QGIS内置数据导入管理器进行标准化转换的流程,并重点推荐了功能更强大的Another DXF Importer插件,以更好地保留文字、块属性等复杂信息。文章对比了两种方法的优劣与适用场景,并提供了坐标系设置、中文乱码等常见问题的避坑指南,帮助用户根据数据需求选择最佳导入策略。

weixin_28363123的博客 117

Java设计模式 八 适配器模式 (Adapter Pattern)

适配器模式是一种解决。

空 1090

2025虚幻游戏逆向工程解包尝试

2025虚幻游戏逆向工程解包指南 本文详细介绍了虚幻引擎5游戏逆向解包的完整流程,主要包括获取AES密钥、生成映射文件和导出资源三个关键步骤。作者在实际操作中遇到诸多难题:AES密钥获取工具存在加壳保护问题,映射文件生成器依赖复杂的VS编译环境,DLL注入工具的使用也存在技术门槛。通过多次尝试,作者发现部分游戏可直接搜索现成的AES密钥,而映射文件生成需要额外下载Memcury依赖库才能正常编译。文章提供了相关工具的下载链接和具体操作说明,但同时也指出每个环节都可能出现意外状况,逆向工程实际执行过程远比理论

wsdchong的博客 6149

对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书

文章目录1. 什么是公钥和私钥?2. 加密算法2.1 对称加密2.2 非对称加密2.2.1 非对称加密的重要性质2.2.2 非对称加密算法应用2.2.2.1 应用1 加密通信2.2.2.1.1 单向认证和双向认证2.2.2.1 应用2 数字签名3. 数字签名3.1 数字签名用法演示3.2 数字签名存在问题4. 数字证书(Digital Certificate)4.1 创建数字证书4.1.1 举例,CA如何给我们签发一个有效证书: 1. 什么是公钥和私钥? 摘自《什么是公钥和私钥?》 公钥(Public Ke

m0_45406092的博客 1万+

adapter pattern java_Java设计模式之适配器模式(Adapter Pattern)

Java设计模式之适配器模式(Adapter Pattern),适配器模式是Java中的结构性模式的一种,最近详细的比较安卓中的Listview和RecycleView的区别,有一点很明显,就是RecycleView中就根本没有添加header和footer的方法,像这种方法也是我们平时常用的,那么只能自己封装了,参考了Listview的做法发现里面用到了适配器的模式就静下心来好好研究了下适配器模...

weixin_39967120的博客 200

LangChain开发避坑指南:为什么Pylance总提示‘无法解析导入‘?实测7种修复方案

本文深入解析了在VS Code中使用LangChain开发时,Pylance频繁提示‘无法解析导入’的根本原因——Python解释器与语言服务器的环境路径不一致。文章提供了从基础排查到深度配置的7种实测修复方案,包括切换解释器、配置extraPaths、使用pyrightconfig.json等,旨在帮助开发者彻底解决此问题,提升AI应用开发效率。

weixin_28826521的博客 444

【设计模式】Java 设计模式之适配器模式(Adapter Pattern)

适配器模式是一种强大的设计模式,它允许我们将不兼容的接口转换为统一的接口,从而简化了系统的集成过程。然而,我们也需要注意到,适配器模式并不是万能的。通过创建适配器,我们可以将遗留系统的接口转换为现代系统所使用的接口,从而实现遗留系统与新系统的无缝集成。工厂模式可以根据输入的参数或配置,返回不同的适配器实例,这样客户端代码就不需要直接创建适配器对象,而是通过工厂来获取所需的适配器。例如,在处理不同格式的数据转换时,我们可以使用策略模式定义多种转换策略,然后在适配器中根据输入数据的格式选择合适的策略进行转换。

新手村长的专栏 2195

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1478

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】

;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。

点云侠的博客 3254

Java设计模式-适配器模式

适配器模式是一种结构型设计模式,它主要通过将一个类的接口转换成客户端所期望的另一个接口,来解决接口不兼容的问题。适配器模式一般包括三个角色:目标(Target)、适配器(Adapter)和被适配者(Adaptee)。其中,目标角色是客户端所期望的接口,适配器角色是将被适配者的接口转换成目标接口的类,被适配者角色是需要被适配的类。适配器模式与其他设计模式的区别在于,它主要是用于接口转换,而其他模式则主要用于解决其他问题,如工厂模式用于对象创建、单例模式用于对象的唯一性等等。

小薯条的博客 989

构网型逆变器下垂控制与电流限幅策略研究:理论、仿真与代码实现

随着分布式发电和微电网技术的快速发展,构网型(Grid-Forming, GFM)逆变器因其能够自主建立电压和频率参考、支撑弱电网及孤岛运行而受到广泛关注。本文提出并实现了一种基于下垂控制的构网型逆变器控制策略,将逆变器等效为受控电压源,通过L型滤波器接入配电网。在公共耦合点(PCC)处实时测量三相电压和电流,计算有功和无功功率,进而采用P-w和Q-V下垂控制生成内部频率和电压幅值,合成三相参考电压。针对故障情况下过电流问题,设计了一种自适应电流限幅模块:当电流幅值超过设定上限时,动态降低电压参考系数k_s

huanghm88的专栏 153

【Java设计模式】适配器模式

文章目录概述适用场景优点缺点拓展适配器-相关设计模式演示 概述 定义:将一个类的接口转换成客户期望的另一个接口 使原本接口不兼容的类可以一起工作 类型:结构型 适用场景 ◆已经存在的类,它的方法和需求不匹配时(方法结果相同或相似) ◆不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案 优点 能提高类的透明性和复用,现有的类复用但不需要改变...

明月沉江春雾晓 1388

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【JAVA设计模式】之适配器模式(AdapterPattern)

使用场景 复用现有类的功能。 项目并非都是从零开始,而在我们编程过程中,也不是所有的功能都需要重新去写,复用现有类的功能是最直接有效的途径 版本升级与兼容性。 随着版本的迭代升级,旧有的一些功能渐渐无法满足需求,现实中又不能直接摒弃,使用Adapter模式可以轻松的来兼容维护新旧版本 图解适配器模式 ...

兵临城下的博客 286

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

DesignPattern_Java:Adapter Pattern

适配器模式 Adapter Pattern 变压器模式Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.将一个类的接口变换

Anonymous 2342

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java设计模式之适配器模式(Adapter Pattern)

总结: 适配器模式是一种简单而实用的设计模式,它能够解决接口不匹配的问题,使得原本不兼容的类可以一起工作。但是,我们发现MP3音乐的播放接口与MP4音乐的播放接口不同。介绍: 适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。例如,一个类使用的是旧的接口,而我们又想要使用一个新的接口,但两者之间方法的名称和参数不同。在上面的示例中,我们成功地使用了适配器模式,通过适配器将MP3音乐播放器适配成了MP4音乐播放器的接口,实现了MP3和MP4音乐播放器之间的无缝协作。

weixin_38682092的博客 152

adapter pattern java_Java设计模式之适配器模式Adapter Pattern

适配器模式Adapter Pattern类型:结构型模式定义:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。--《JAVA与模式》优点:更好的复用性更好的扩展性缺点:过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。...

weixin_42321940的博客 265

Java设计模式之适配器模式

Java设计模式之适配器模式前言正文一、定义二、分类三、结构四、缺省适配器模式五、双向适配器六、适配器模式优缺点与适用环境优点类适配器模式:对象适配器模式:缺点类适配器模式:对象适配器模式:适用环境 前言 适配器模式是一种使用频率非常高的结构型设计模式,如果系统中存在不兼容的接口,可以通过引入一个适配器来使原本因为接口不兼容而不能在一起工作的两个类能够协同工作。 在GoF设计模式中包含7种结构型模...

js_tengzi的博客 393

Java设计模式-适配器模式(Adapter Pattern)

适配器模式作为一种结构型设计模式,在软件系统设计开发中使用到的频率非常之高,比如Java中的jdbc。本文结合具体案例讲解适配器模式的知识要点。

IT熊的专栏 387

Java设计模式——适配器模式【Adapter Pattern】

Java设计模式、适配器模式、Adapter Pattern

scorpio的博客 1043

Java设计模式-结构型设计模式-适配器模式

Java设计模式- 结构型设计模式-适配器模式

Fatter$hday的博客 1931

java设计模式---适配器模式(Adapter pattern)

java设计模式—适配器模式(Adapter pattern) 前面已经详细的讲解了java23种设计模式中的创建型模式,接下来就讲解下结构型设计模式—适配器模式(Adapter pattern) 1. 定义 适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不兼容而无法一起工作的两个类能一起工作。适配器模式是结构型设计模式之一,其在不修改原来两个模块代码的情况下,将...

渔潭的博客 535

图解Java设计模式之适配器模式

图解Java设计模式之适配器模式现实生活中的适配器例子适配器模式基本介绍适配器模式工作原理类适配器模式类适配器模式注意事项和细节对象适配器模式对象适配器模式注意事项和细节接口适配器模式适配器模式在SpringMVC框架应用的源码分析适配器模式的注意事项和细节 现实生活中的适配器例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了。 适配器模式基本介绍 1)适配器...

不一样的花朵的博客 519

Java23种设计模式 适配器模式【Adapter Pattern】

好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛。今天讲适配器模式,这 个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用, 虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换 为你需要的 36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也 是这个意...

宇智波带土 340
上一篇: Android 热更新——非侵入AOP框架
下一篇: Java设计模式 - 装饰器模式
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值