位置: IT常识 - 正文

设计模式---适配器模式(设计模式适配器模式代码编写)

编辑:rootadmin
简述 类型:结构型 目的:解决接口不兼容问题。 话不多说,看个案例吧。 优化案例 最初版v0 在真实的开发场景中,系统的每个模块都是分配给不同的团队或个人来开发的。这使得事前沟通变得尤为重要,且沟通问题也时有发生。现在公司有两个模块无法兼容,难道只能重写其中的一个吗? class User { St ... 简述类型:结构型目的:解决接口不兼容问题。

推荐整理分享设计模式---适配器模式(设计模式适配器模式代码编写),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:适配者设计模式,设计模式适配器模式,设计模式适配器模式实验报告,设计模式适配器模式和装饰器模式有什么区别,设计模式适配器属于什么类型,设计模式适配器模式和装饰器模式有什么区别,设计模式适配器与目标完全解,设计模式适配器模式,内容如对您有帮助,希望把文章链接给更多的朋友!

话不多说,看个案例吧。

优化案例最初版v0

在真实的开发场景中,系统的每个模块都是分配给不同的团队或个人来开发的。这使得事前沟通变得尤为重要,且沟通问题也时有发生。现在公司有两个模块无法兼容,难道只能重写其中的一个吗?

class User { String name; String sex; int age; // 剩下的属性就不写了,都是废话没啥意义 public User(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; }}interface Filter { List<User> findAll(); User findByName(String name);}class FilterImpl implements Filter { // Adaptee List<User> users; public FilterImpl(List<User> users) { this.users = users; } public List<User> findAll() { return users; } public User findByName(String name) { if (name == null) throw new RuntimeException("请输入正确的ID!"); return (User) users.stream().filter(t -> name.equals(t.name)).findFirst().orElse(null); }}interface JsonFilter { // Target String allToJson(); String findByNameToJson(String id);}

客户想要查询user并且返回结果对象的Json,只是当前的两个模块没法满足需求,如果不想修改这两个模块,我们如何实现两个模块功能的整合呢?

修改版v1(类适配器)设计模式---适配器模式(设计模式适配器模式代码编写)

我们引入一个新的类作为适配器来适配原有的两个模块。

class User { String name; String sex; int age; // 剩下的属性就不写了,都是废话没啥意义 public User(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; }}interface Filter { List<User> findAll(); User findByName(String name);}class FilterImpl implements Filter { // Adaptee List<User> users; public FilterImpl(List<User> users) { this.users = users; } public List<User> findAll() { return users; } public User findByName(String name) { if (name == null) throw new RuntimeException("请输入正确的ID!"); return (User) users.stream().filter(t -> name.equals(t.name)).findFirst().orElse(null); }}interface JsonFilter { // Target String allToJson(); String findByNameToJson(String id);}class JsonFilterAdapter extends FilterImpl implements JsonFilter { // Adapter public JsonFilterAdapter(List<User> users) { super(users); } public String allToJson() { List<User> users = super.findAll(); return new Gson().toJson(users); } public String findByNameToJson(String name) { User user = super.findByName(name); return new Gson().toJson(user); }}

代码修改后,我们来看一个客户端的使用案例。

class client {public static void main(String[] args) { List<User> users = new ArrayList<>(); users.add(new User("张三", "男", 19)); users.add(new User("李四", "男", 35)); users.add(new User("小红", "女", 21)); JsonFilterAdapter jfa = new JsonFilterAdapter(users); String allUser = jfa.allToJson(); String user = jfa.findByNameToJson("张三"); System.out.printf("%s%n%s", allUser, user); }}

使用了类适配器确实让我们可以在不修改原有两个模块的情况下,以增加一个适配器类为代价整合两大模块。但,由于类适配器需要继承结构中的Adaptee,且在客户端中的使用我们也能看出虽然我们能够调用继承的方法但没有直接使用。既然不使用为啥继承呢?

这就引出了新的问题:我们是否有必要使用继承来实现适配器。如答案是否,那不使用继承我们又如何设计适配器呢。这就得看接下来的优化了。

修改版v2(对象适配器)(推荐)

我们的问题,对象适配器可以解决!!!

class User { String name; String sex; int age; // 剩下的属性就不写了,都是废话没啥意义 public User(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; }}interface Filter { List<User> findAll(); User findByName(String name);}class FilterImpl implements Filter { // Adaptee List<User> users; public FilterImpl(List<User> users) { this.users = users; } public List<User> findAll() { return users; } public User findByName(String name) { if (name == null) throw new RuntimeException("请输入正确的ID!"); return (User) users.stream().filter(t -> name.equals(t.name)).findFirst().orElse(null); }}interface JsonFilter { // Target String allToJson(); String findByNameToJson(String id);}class JsonFilterAdapter implements JsonFilter { // 不在继承FilterImpl private Filter filter; // 继承 → 聚合 public JsonFilterAdapter(List<User> users) { this.filter = new FilterImpl(users); } public String allToJson() { List<User> users = filter.findAll(); return new Gson().toJson(users); } public String findByNameToJson(String name) { User user = filter.findByName(name); return new Gson().toJson(user); }}

我们再看看客户端的调用代码。

class client {public static void main(String[] args) { List<User> users = new ArrayList<>(); users.add(new User("张三", "男", 19)); users.add(new User("李四", "男", 35)); users.add(new User("小红", "女", 21)); JsonFilterAdapter jfa = new JsonFilterAdapter(users); String allUser = jfa.allToJson(); String user = jfa.findByNameToJson("张三"); System.out.printf("%s%n%s", allUser, user); }}

调用代码完全没有变化,但实际上已经无法在客户端中调用Filter中定义的方法了,这使得Adapter类的都耦合度更低,有利于使用和维护。

总结优点使用适配器模式,不需要对于现有模块修改,符合开闭原则。可以针对现有的模块创建多种多样的适配器,而客户端只需要调用适配器即可。让客户端与现有的多个模块解耦,防止日后模块修改时客户端也需要随之修改。缺点随着适配器类的加入,现有的系统将越发复杂。增加了开发人员对于系统的理解难度。适用场景需要整合两个不兼容接口的场景。
本文链接地址:https://www.jiuchutong.com/zhishi/310485.html 转载请保留说明!

上一篇:总结帝国CMS下在PHP文件中调用数据库类执行SQL语句实例(帝国cms专题)

下一篇:mysql数据库有什么特点(MySQL数据库有什么特点)

  • mac怎么设置屏幕常亮呢(mac怎么设置)

    mac怎么设置屏幕常亮呢(mac怎么设置)

  • 苹果手机如何取卡(苹果手机如何取消qq音乐自动续费)

    苹果手机如何取卡(苹果手机如何取消qq音乐自动续费)

  • 朋友圈空白评论怎么弄(朋友圈评论空白回复怎么弄的)

    朋友圈空白评论怎么弄(朋友圈评论空白回复怎么弄的)

  • 启用160mhz带宽什么意思(160mhz占用几个信道)

    启用160mhz带宽什么意思(160mhz占用几个信道)

  • ipad卸载不了应用程序(ipad卸载app没反应)

    ipad卸载不了应用程序(ipad卸载app没反应)

  • 手机插上耳机滋滋老响(手机插上耳机滋滋老响怎么解决)

    手机插上耳机滋滋老响(手机插上耳机滋滋老响怎么解决)

  • iphone8小圆点怎么没了(iphone8小圆点怎么设置截屏)

    iphone8小圆点怎么没了(iphone8小圆点怎么设置截屏)

  • 头条号展现量是什么(头条展现量是推荐量吗)

    头条号展现量是什么(头条展现量是推荐量吗)

  • 笔记本开机黑屏有鼠标(笔记本开机黑屏不显示任何东西)

    笔记本开机黑屏有鼠标(笔记本开机黑屏不显示任何东西)

  • 抖音注销账号需要7天(抖音注销账号需要几天成功)

    抖音注销账号需要7天(抖音注销账号需要几天成功)

  • 没有淘宝店铺可以在抖音上卖货吗(没有淘宝店铺可以开淘特吗)

    没有淘宝店铺可以在抖音上卖货吗(没有淘宝店铺可以开淘特吗)

  • 为什么小红书发布的内容别人看不到(为什么小红书发不了评论)

    为什么小红书发布的内容别人看不到(为什么小红书发不了评论)

  • 有线和无线的区别(有线和无线的区别耳机)

    有线和无线的区别(有线和无线的区别耳机)

  • 微信到现在出了多少年了(微信出新功能了吗)

    微信到现在出了多少年了(微信出新功能了吗)

  • 朋友圈能发60秒视频吗(朋友圈可以发60秒的视频吗)

    朋友圈能发60秒视频吗(朋友圈可以发60秒的视频吗)

  • 新版手机微博草稿箱在哪(手机新浪微博的草稿箱在哪)

    新版手机微博草稿箱在哪(手机新浪微博的草稿箱在哪)

  • 光猫有无线功能吗(光猫有无线功能还用装路由器吗)

    光猫有无线功能吗(光猫有无线功能还用装路由器吗)

  • pad和ipad的区别(一千元左右的平板哪个比较好)

    pad和ipad的区别(一千元左右的平板哪个比较好)

  • 苹果a1567是ipad几啊(a1567是ipad什么型号)

    苹果a1567是ipad几啊(a1567是ipad什么型号)

  • 华为mate30怎么打开双击亮屏(华为mate30怎么打开volte)

    华为mate30怎么打开双击亮屏(华为mate30怎么打开volte)

  • word数字上标(word数字上标怎么打)

    word数字上标(word数字上标怎么打)

  • 苹果更新软件在哪里(苹果更新软件在那里关?)

    苹果更新软件在哪里(苹果更新软件在那里关?)

  • 无线ap隔离是什么意思(无线网络ap隔离是什么)

    无线ap隔离是什么意思(无线网络ap隔离是什么)

  • pdsch信道的调制方式(pdcch信道采用polar码信道编码方式,调制方式)

    pdsch信道的调制方式(pdcch信道采用polar码信道编码方式,调制方式)

  • 苹果x太耗电怎么解决(苹果x耗电量大)

    苹果x太耗电怎么解决(苹果x耗电量大)

  • oppo手机有扫描功能吗(oppo手机有扫描文件功能吗)

    oppo手机有扫描功能吗(oppo手机有扫描文件功能吗)

  • 微信保存到通讯录什么意思(微信保存到通讯录)

    微信保存到通讯录什么意思(微信保存到通讯录)

  • 小米9se什么意思(小米9se的se是什么意思)

    小米9se什么意思(小米9se的se是什么意思)

  • 苹果id信任手机号忘了(苹果id信任手机号更换无效)

    苹果id信任手机号忘了(苹果id信任手机号更换无效)

  • Qt+OpenCV(一)Qt基础操作和使用opencv初识(qt+opencv教程)

    Qt+OpenCV(一)Qt基础操作和使用opencv初识(qt+opencv教程)

  • 富文本编辑器介绍(富文本编辑器使用)

    富文本编辑器介绍(富文本编辑器使用)

  • python能读取tsv吗(python读取text)

    python能读取tsv吗(python读取text)

  • 前端面试题整理——React考点和回答(前端面试题目100及最佳答案)

    前端面试题整理——React考点和回答(前端面试题目100及最佳答案)

  • 小规模企业所得税会计分录怎么做
  • 社保的滞纳金放什么科目
  • 职工受到工伤后应该怎么办
  • 一次性发放年终奖怎么税务筹划
  • 已核销的坏账又收回会计分录
  • 资产负债表两边不平衡的原因
  • 职工教育经费税法
  • 计提社保费计入什么科目
  • 取暖补贴国家标准
  • 多扣了离职人员的钱
  • 企业如何进行利润分配的会记处理
  • 零税率发票可以冲成本吗
  • 通讯费计入什么部门
  • 固定资产折旧在资产负债表属于什么
  • 补充养老保险计算器
  • 付现所得税体现在哪方面
  • 资金账簿印花税申报期限
  • 司机出车补助会计科目
  • 内存条松动导致黑屏
  • 劳务报酬所得包括哪些?与工资薪金所得的区别?
  • 什么情况下可以认定为工伤
  • 哪里有办各种真实有效的证的
  • win11粘滞键怎么关闭 重启后又有
  • php的pdo
  • babel-plugin-import
  • 住房公积金怎么补缴费
  • php变量底层实现
  • chattr
  • 企业出租房屋怎么做账
  • laravel访问路由方式
  • 收回前欠货款存入银行的会计分录
  • 增值税发票认证抵扣时间规定
  • 若依和pig
  • 帝国cms使用手册
  • 网上报税流程演示2019
  • 工资月末结转
  • 银行存款手工明细分类账
  • 对附属单位补助的资金性质是财政预算资金
  • 其他应付款个人在贷方表示什么
  • mongodb运行
  • php.ini上传限制
  • 政府补贴流程
  • 现金股利要交税
  • 股权转让受让方委托书
  • 建筑公司多个项目分别选计税方法的适用文件
  • 培训机构财务怎么做账
  • 政府补助如何确定收入
  • 小规模企业主营业务成本分录
  • 固定资产补提折旧的账务处理
  • 调研费属于什么会计科目
  • 商场返券计算公式
  • 检测费账务处理
  • 业务招待费扣除标准2023
  • 租赁房产税计税依据及计算方式是什么
  • 高新技术产品收入归集依据
  • 应收账款管理应该收集哪些信息
  • 收到社保局的稳岗通知
  • 借款跨年要交个税吗
  • 运杂费计入什么会计科目
  • 丢失的发票怎么查询
  • 买断式与回购式
  • 应收账款和坏账准备的解题思路
  • 深入sql编程开发与优化
  • xp附件游戏
  • ubuntu更新版本
  • ubuntu adb找不到设备
  • win10周年更新版是什么意思
  • rsmsink.exe - rsmsink是什么进程 有何作用
  • 两种方法教你锁门
  • 怎么用linux运行c程序
  • 误删了一些文件电脑不能正常启动了
  • 新闻客户端手机版下载
  • 深入理解python异步编程
  • android开发菜鸟教程
  • 如何编写高质量创业计划书实验小结
  • jquery显示隐藏div
  • 陕西省地税稽查局吴爱成
  • 财税专家刘杨简历
  • 租房税多少钱
  • 湖北低保查询网站官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设