图解设计模式:动动手玩转适配器模式

Android----banner使用详解 Android----banner使用详解 昨天10.31 ,斗破苍穹的三年之约终于出来了,自己也等了很久很久,敬师长,敬家人,敬朋友,敬每一个前行路上正在奋战的自己,星光不问赶路人,时间不负有心人。 效果图: 添加依赖 implementation 'com.youth.banner:banner:2.1.0' 添加权限到你的 AndroidManifest.xml <!-- if you want to load images from the internet --> 阅读详情

前言

📣 📣 📣 📢📢📢
☀️☀️点开就是缘分认识一下,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。
📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅长使用Java技术开发web项目和工具
📒 文章内容丰富:覆盖大部分java必学技术栈,前端,计算机基础,容器等方面的文章
📒 如果你也对Java感兴趣,关注小冷吧,一起探索Java技术的生态与进步,一起讨论Java技术的使用与学习
✏️高质量技术专栏专栏链接: 微服务,数据结构,netty,单点登录,SSM ,SpringCloudAlibaba等
😝公众号😝 : 想全栈的小冷,分享一些技术上的文章,以及解决问题的经验
⏩当前专栏:设计模式系列
⏩专栏代码地址: 代码地址

适配器模式 Aadpter

这个模式其实在生活中很好就能找到案例:

比如我们的笔记本电脑 都会有一个电源适配器来基于我们笔记本进行供电。

​ image-20221215200630916

在程序中,经常会现有的程序无法直接使用,会出现需要做适当的变化之后才可以使用到情况。折中用于填补现有程序和所需程序之间差异的设计模式就是Adapter模式

Adapter模式也被称为Wrapper模式,wrapper有包装器的意思,就像用精美的包装纸把商品包装成礼物那样,替我们把代码封装起来,使其可以用于其他用途

Adapter模式有以下两种:

  • 类适配器模式(使用继承的适配器)
  • 对象适配器模式(使用委托的适配器)

类适配器模式

实现思路

首先,让我们来看一段使用继承的适配器的示例程序。这里的示例程序是一段会将输入的字符
串显示为(Hello)或是&Hello&的简单程序。

目前在Banner类中,有将字符用括号括起来的showWithParen方法,和将字符串用&号括起来的showwithAster方法

假设Print接口中声明了两种方法,即字符串显示(加括号)的printWeak方法,和调字符串显示(加&号)的printstrong方法。

现在要做的事情是使用Banner类编写一个实现了Print接口的类,也就是说要做一个将
内容转换的适配器。

扮演适配器角色的是PrintBanner类。该类继承了Banner类并实现了“需求”——Print
接口。PrintBanner类使用showWithParen方法实现了printWeak,使用showwithAster
方法实现了printstrong。这样,PrintBanner类就具有适配器的功能了。

类的对应图

image-20221215221545495

使用了类适配器的示例程序的类图(继承)

image-20221215221615955

示例代码

像上面举例的笔记本电脑的例子

  • banner类 就像是输出 100伏特电压的插座口
  • print接口 就像是输出12伏特电压的输出口
  • printBanner类就像适配器一样,让我们只需要调用print接口就可以拿到banner类的结果
Banner类

作为基类,有提供输出两种不同内容的方法,

public class Banner {
    private String string;

    public Banner(String string) {
        this.string = string;
    }

    public void showWithParen(){
        System.out.println("("+string+")");
    }
    public void showWithAster(){
        System.out.println("&"+string+"&");
    }
}
Print接口

可以理解为 适配器的一端 提供两种输出方式

public interface Print {
    public abstract void printWeak();
    public abstract void printStrong();
}
printBanner类

作为适配器 让需要使用到类只需要调用 print 就可以拿到 banner的结果

public class printBanner extends Banner implements Print {
    public printBanner(String string) {
        super(string);
    }

    @Override
    public void printWeak() {
     showWithParen();
    }

    @Override
    public void printStrong() {
        showWithAster();
    }
}
测试用例
    public static void main(String[] args) {
        Print printBanner = new printBanner("hello");
        printBanner.printWeak();
        printBanner.printStrong();
    }

image-20221215225429498

总结

在main方法中 我们使用到时print 接口,对于main来说 banner对于我们来说是完全隐藏起来的,就像是笔记本只要能在直流12伏特电压下就可以正常工作,他并不知道这12伏特是由适配器将100伏特电压转换而成的。

main类是不知道printBanner类是如何实现的,这样就可以在不用对main类进行修改的情况下,改变printBanner类

使用委托方式的适配器模式

上一个示例我们用类适配器模式了,下面我们再来看看对象适配器模式,在之前的示例程序中,我们用继承实现适配,在这里我们用 “委托” 来实现

PS: 委托可以理解为 把事情交给别人干

类图

类图也是发生了变化 printbanner实例化了banner来做一些事情

image-20221215225846504

示例
public class printBanner1  implements Print {
    private Banner banner;
    public printBanner1(String string) {
        this.banner = new Banner(string);
    }

    @Override
    public void printWeak() {
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}

只需要修改PrintBanner就可以了,这里没有采用继承而是直接生成了banner的示例去调用banner的方法

在Adapter适配器模式中的角色

  • Target 对象 这个角色定义了所需要的方法 print 依照文章开头的例子来说 就是需要使用到12伏特电源
  • Client 使用者 这个角色负责使用被适配后的内容,main 依照例子就是需要使用12伏特电源的电脑
  • Adaptee 被适配 这个角色是一个持有既定方法的角色 依照例子就是一百伏特的插头,由banner扮演此角色,当被适配的角色和target角色方法相同,也就是家庭电压就是12伏特那么就不需要这个角色
  • Adapter 适配器模式的主人公 pringBanner主要负责兼具两侧的功能作为混合,用Adaptee的角色来满足target的要求,这就是适配器模式的目的

拓展思路

什么时候我们需要用上Adapter模式

如果某个方法就是我们所需要的方法,那么直接在程序中使用不就可以了? 很多时候进场会用到的类

实际上,我们在让现有的类适配新的接口时,常常会有 “只要将这里稍微修改一下就可以了” 的想法,一不留神就会修改现有代码,需要注意的是,如果要对已经测试完毕的现有代码进行修改,就必须要在修改后重新测试

Adapter 模式会对现有的类进行适配,生成新的类,通过该模式很方便创建我们需要的方法区,当出现bug的时候,我们明确的知道bug不在现有的类(Apdaptee 角色)中,所以只需要调查Adapter角色的类即可,这样代码的可维护性也提高了

如果没有线程的代码

让现有类适配新的接口时,使用适配器类貌似是一种很不错的解法,但是实际上我们遇到现有类适配新接口时,尝尝会有“只要修改一下就可以使用到”的想法,就会修改现有代码,需要注意的是如果要对已经测试完毕的代码进行修改就会又要测试

兼容性与升级性

软件的生命周期总是版本的升级,当版本升级的时候经常会出现与旧版本的兼容性问题,如果能够完全抛弃旧版本,那么软件维护起来也会轻松一些,但是在日常开发中往往无法抛弃旧版本,这个时候就可以使用适配器版本来做新旧版本的兼容

​ 假设我们今后指向维护新版本那么只需要维护新版本的Adaptee角色,旧版本扮演target角色

拓展示例

Q: 我们为什么用print来使用printbanner的功能 而不是直接用printbanner呢?

A:我们使用print的原因是只需要使用print里的方法,其实用哪一种都是一样,printbanner里的可能还有其他的方法,

拓展代码

请使用适配器模式编写一个将属性集合保存到文件中的FileProperties类中。

这里,我们假设代码的FileIO接口声明了FileProperties需要实现的方法,输入文件file.txt和输出文件newfile.txt的内容如下

输入文件

yaer= 1999

输出文件

day=21
yaer=2004
month=4

main方法为

    public static void main(String[] args) {
        FileIO f = new FileProperties();
        try {
            f.readFromFile("D:\\JavaEngineer\\DesignPatterns\\DesignPattern\\DesignPattern\\src\\main\\java\\hyc\\Adapter\\expand\\file.txt");
            f.setValue("year","2004");
            f.setValue("month","4");
            f.setValue("day","21");
            f.writeToFile("D:\\JavaEngineer\\DesignPatterns\\DesignPattern\\DesignPattern\\src\\main\\java\\hyc\\Adapter\\expand\\newfile.txt");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

fileio类

public interface FileIO {
    void readFromFile(String filename) throws IOException;
    void writeToFile(String filename) throws IOException;
    void setValue(String key,String value);
    String getValue(String key);

}

fileProperties 作为适配fileio和Properties的类

Properties为java.util下的Proerties工具类

public class FileProperties extends Properties implements FileIO {


    @Override
    public void readFromFile(String filename) throws IOException {
        load(new FileInputStream(filename));
    }

    @Override
    public void writeToFile(String filename) throws IOException {
    store(new FileOutputStream(filename),"written by FileProperties");
    }

    @Override
    public void setValue(String key, String value) {
        setProperty(key,value);
    }

    @Override
    public String getValue(String key) {
        return getProperty(key);
    }
}

file文件有上述内容 newfile为空 此时我们执行代码

image-20221216001446993

运行结果

ROS学习笔记之——无人机PID调参过程记录 For cooperaive inquiries, please visit the website:guanweipeng.com 阅读详情

相关推荐

微信小程序后台定位与实时位置更新的实战指南

本文提供了微信小程序实现后台定位与实时位置更新的完整实战指南。针对小程序退到后台后位置更新中断的痛点,详细解析了基于`startLocationUpdateBackground`API的后台定位解决方案。内容涵盖从隐私协议配置、项目权限声明,到授权、启动、监听、停止的核心代码流程,并分享了真机调试、性能优化及权限引导等关键避坑经验,帮助开发者构建稳定可靠的后台位置服务。

weixin_29008055的博客 466

一看就懂的适配器设计模式

1 简介一般客户端通过目标类的接口访问它所提供的服务。有时,现有类可以满足客户端类的需要,但所提供接口不一定是客户端所期望的,可能因为现有类中方法名与目标类中定义的方法名不一致。这时,现有接口需要转化为客户端的期望接口,保证复用现有类。若不进行这样转化,客户端就不能利用现有类所提供功能,适配器模式就可以完成这样的转化。在适配器模式中可以定义一个包装类,包装不兼容接口的对象...

JavaEdge全是干货的技术号 1173

Labview执行adbshell操作

一、目录 1、实现思路 2、adbshell工具配置 3、Labview执行命令窗口 1、实现思路 使用Labview的优点: 1、可以配合电源系统或者调用其他接口工具实现更高程度的自动化测试; 2、直接执行Linux相关命令,编写相关执行顺序或者逻辑更简易; --------可以用adbpush命令将.sh的脚本文件推入控制器内部执行; 3、Ubuntu系统比较大,如果只是日常执行脚本测试还是比较占用磁盘空间; 2、adbshell工具配置 1)下载adbshell工具; adbshell工具下载链

zataji的博客 2052

springboot 源码解析(4)打印的banner原理以及如何修改

继续上一节 发现两个参数的构造方法继续调用了四个参数的构造参数 这个没有什么神奇的操作。简单的赋值 我们继续返回看那个bind方法 我们先看看 Bindable.ofInstance(this)干啥了 instance是SpringApplication本身 type取到类,这里有个of(type)我们瞧瞧他又是干啥的 先看ResolvableType.for...

小风程序员的博客 659

强化学习 | Multi Agents | Trust Region | HATRPO | HAPPO

ICLR2022多智能体论文,将trust region推广到MA上,保证单调递增。学习博客,共7k字,纯手敲。含大量手写笔记。

111辄的博客 1万+

QGIS插件实战:用百度地图AOI数据做个城市公园分析,从下载到出图全记录

本文详细介绍了如何利用QGIS的百度地图AOI插件进行城市公园分析,从插件安装、数据获取到空间分析与可视化全流程。通过实战案例演示了公园面积统计、服务范围缓冲区分析及专题地图制作,帮助用户高效完成城市绿地评估工作。

weixin_30790841的博客 556

关于banner的全面用法---新手

关于banner的全面用法-----新手必看

m0_64332518的博客 2114

华为海思IC前端中后端(COT&XPU)岗位笔试机考题

华为海思COT和XPU部门IC前端,IC中端,IC后端岗位笔试真题分享

weixin_37584728的博客 3360

xbanner适配器

final List list = new ArrayList<>(); result = bannerBean.getResult(); for (int j = 0; j < result.size(); j++) { list.add(result.get(j).getImageUrl()); } ((BannerHolder) viewHolder).banner.set...

weixin_43241892的博客 259

Python爬虫实战:5分钟抓取东方财富股票数据并保存为CSV

在投资分析与量化研究的日常工作中,获取结构化、可用的金融数据往往是第一步。对于个人投资者和量化入门者而言,如何高效获取A股全市场行情,常常面临网页动态加载、反爬机制与数据整理繁琐等挑战。本文从数据采集的基础概念出发,介绍如何利用Python这一通用编程语言,通过requests库请求财经网站公开的HTTP接口,获取返回的JSON数据,再借助pandas进行字段映射、数据清洗与表格化处理。这种方式相比传统页面解析具有响应快、结构稳定、易于批量操作的显著优势,尤其适合构建个人股票数据池、验证选股策略或进行市场情

weixin_33146151的博客 251

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

* 开启所有数字部分 */#define TLV320AIC3204_REG_LEFT_HEADPHONE_OUT_VOLUME 0x0C /* 左声道耳机输出音量 */#define TLV320AIC3204_REG_DIGITAL_AUDIO_PATH_CONTROL 0x05 /* 数字音频路径控制 */#define TLV320AIC3204_REG_ANALOG_HP_FILTER_CONTROL 0x34 /* 模拟耳机滤波器控制 *//* 最大音量 */

corlin6688的博客 520

banner适配器封装

public class BannerAdapter implements OnBannerListener { //banner public Banner banner; //图片路径的集合 List childList; //图片地址的集合 List list_path = new ArrayList<>(); //标题集合 L

潇湘夜雨 873

【26美赛C题】Data With The Stars第三问[影响因素分析模型]思路与代码

本文针对2026美赛C题《Dancing with the Stars》第二问,提出了一套系统的影响因素分析框架。通过多元回归模型和固定效应模型,量化分析了明星特征(年龄、职业等)、舞者搭档和比赛周次对评分的影响,发现评委与观众偏好存在差异。研究采用方差分解评估舞者效应占比,通过最优年龄分析和交互效应检验揭示非线性关系。最后运用差异性检验和结构方程模型(SEM)比较评委与观众偏好,为比赛结果预测和选手优化提供量化依据。该分析框架可系统揭示比赛成绩的关键驱动因素。

一键难忘的博客 756

适配器(Adapter)

1、什么是适配器 在一个中间类中充当胶水,实现一个定义方法类和一个实现方法类的的关联的类叫做适配器 2、<使用继承适配器> 要求一个string的输出print方法能输出两种类型, 弱类型 (string) 强类型 -string- \ 类型 名 角色 1 接口 Print 输出方法的接口 2 类 PrintBanner ...

谭宇 1126

android 蓝牙通讯demo

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

banner代码分析

banner实现方式分析   作为一名android开发小白,最近要用到banner轮播图,于是便研究了一下banner的实现方式,在此记录一下所用到的知识点。   我是在github上看到的这个项目,地址:banner轮播图 将banner引入到项目中的方式上述链接已有描述,使用起来还是比较方便的。使用的方法如下: 接下来会对每一行代码进行分析。 1、banner.setImageLoader(new GlideImageLoader())   这里我们需要实现一个图片加载器,作用:banner的图片来

weixin_40848627的博客 3273

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Banner+多条目适配器

package com.bawei.www.wangshuai11_19.Adpter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageVie...

wangshuai_97的博客 810

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 310

高扩展性AI应用架构指南:融合RAG检索、Agent编排与OpenAPI/RPC工具网关的设计模式

本文提出高扩展性AI应用的三层架构:RAG检索层(知识供给)、Agent编排层(决策推理)、工具网关层(能力执行)。通过检索策略路由实现智能分流,混合检索采用RRF融合算法提升精度;Agent层采用无状态设计与外部状态存储,支持水平扩展;工具网关层通过协议标准化与动态注册解耦系统。核心思想是各层独立演进,不相互牵制,实现从“能跑”到“可扩展”的工程跃迁。

2301_80078096的博客 183

设计模式速查

本文梳理12个核心设计模式,涵盖创建型、结构型与行为型,提供简洁Java实现与面试要点。重点解析单例(静态内部类)、工厂(方法/抽象)、建造者(链式构建)等高频模式,强调代码可维护性与扩展性,附速记口诀与对比表格,助力开发与面试双提升。

ttlovet的博客 157

设计模式与生活⑬:你坐几号线,谁来运营是另一回事

一到周五,小王的心情就会好一点。倒不是工作少了,而是想到这一天忙完,后面接着双休,心里就有盼头。地铁上,他抬头看标识,发现一件平时没留意的事:5 号线、10 号线常见的是“北京地铁”,4 号线却写着“京港地铁”。再想想,北京的机场也各有各的名字:首都机场、大兴机场。可在成都坐地铁,日常看到的统一称谓就是“成都地铁”。都是出行,名称和背后的主体并不完全一样。对乘客来说,常做的事还是那几样:查线路、进站、上车、到站下车。坐几号线是一条信息,谁来运营是另一条信息,不必揉成一团。同样是在北京坐地铁,线路和运营方并不

工一木子 213

【第四部分:Agentic 智能体设计模式】17. Agent 路由模式详解:从意图识别到动态模型选择

本文介绍 Agent Routing(路由模式)的基本原理与工程实现,重点分析任务路由、模型路由、工具路由和专业 Agent 路由的区别及适用场景。结合 BaseMetas EKA 企业知识助手,介绍规则与模型混合路由、Java Router 实现、复合任务处理、低置信度兜底和误路由评估,并以 Jev 专用决策模型、动态模型选择及 Tool Search 等近期技术为例,说明如何在保证权限与执行安全的前提下,提高 Agent 任务分发的准确性和效率。

weixin_42258782的博客 621

设计模式与生活⑭:一栋楼,共用一份热

今天是立冬。天气预报说夜里有暴雪,白天最高也就 4 度。早上起来,屋里比外面强不了多少。窗玻璃上蒙着一层水汽,摸一把暖气片,凉的。物业群里发了通知:今天开始试供暖,暖气片会慢慢热起来,顶层记得排气,边户留意自家热不热。隔了会儿再摸,暖气片上热下凉,温温的,不烫手。再晚一点,整间屋子总算有了点热乎气。一天里最踏实的一件事,是知道这栋楼里不只自己一户在等热。热力站烧的是一锅水,顺着管网送到每家,各家只管拧自己那个阀门。试供暖第一天,暖气片温而不烫今天聊的。

工一木子 311

设计模式与生活⑪:地铁里被打扰,别总靠自己硬扛

周三的地铁上,小王本来想在脑子里过一遍今天要做的事。旁边一位大哥戴着耳机打电话。耳机里对方说什么,别人听不见;大哥自己的声音,却一句一句落在外面。声音不算大,也没有嚷,可就是不停。你刚把那件事想到一半,旁边又接上一句;刚想不去留意,下一句又钻进来了。最磨人的不是哪一句特别响,而是你拿不准这通电话还要多久。小王没说什么,站起来,往车厢另一头挪了挪。距离拉开,思绪才慢慢接了回去。耳机收住了电话另一端的声音,收不住说话人的声音这让他想起之前的另一次经历。

工一木子 152

设计模式 - 访问者模式

概述 访问者模式(Visitor Pattern)是一种行为型设计模式,它通过为对象结构中的每个元素添加一个访问操作,使得可以在不改变元素类的前提下定义作用于这些元素的新操作。

2601_96797912的博客 175

工作流 vs 自主 Agent:5 种设计模式与 3 种建模方式详解

本文基于 Anthropic《Building Effective Agents》指南,系统梳理了AI应用中的两类核心架构:Workflow(编排式)与Agent(自主智能体)。强调“能画流程图就不上Agent”,提出从简单提示链到复杂自主决策的5种可组合工作流模式,并给出选型口诀与工程实践建议。核心观点:优先用确定性、可审计的Workflow,仅在任务路径未知时启用Agent,避免盲目复杂化。

分享大数据、java相关的技术 148

【QT C++】常用设计模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

ocy的博客 231
上一篇: Go语言编程设计学习Day1:helloworld 变量 常量
下一篇: 图解设计模式:Teamplate Method 模板方法模式 由子类实现具体内容的模式
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值