位置: 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数据库有什么特点)

  • 支付宝如何隐藏姓名(支付宝如何隐藏真实姓名和电话号码)

    支付宝如何隐藏姓名(支付宝如何隐藏真实姓名和电话号码)

  • 微信视频号发视频有收益吗(微信视频号发视频卡顿怎么回事)

    微信视频号发视频有收益吗(微信视频号发视频卡顿怎么回事)

  • 自然饱和度和饱和度的区别(自然饱和度和饱和度有什么区别)

    自然饱和度和饱和度的区别(自然饱和度和饱和度有什么区别)

  • 看对方朋友圈是一条线(看对方朋友圈是一条线中间一个月亮)

    看对方朋友圈是一条线(看对方朋友圈是一条线中间一个月亮)

  • 华为路由器ipv6是什么意思(华为路由器IPV6打开好还是不打开好)

    华为路由器ipv6是什么意思(华为路由器IPV6打开好还是不打开好)

  • 微信里的购物怎么变成京喜了(微信里的购物怎么找)

    微信里的购物怎么变成京喜了(微信里的购物怎么找)

  • a5处理器相当于骁龙几(a5 处理器)

    a5处理器相当于骁龙几(a5 处理器)

  • iphone11屏幕有一条黑线		(iphone11屏幕有一条黑线)

    iphone11屏幕有一条黑线 (iphone11屏幕有一条黑线)

  • 苹果8p怎么降低版本(苹果8p如何降低系统版本)

    苹果8p怎么降低版本(苹果8p如何降低系统版本)

  • 淘宝同一时间下单人数过多怎么办

    淘宝同一时间下单人数过多怎么办

  • 路由器信号满格却很卡(路由器信号满格但速度很慢)

    路由器信号满格却很卡(路由器信号满格但速度很慢)

  • windows是计算机系统中的什么系统(windows是计算机语言吗)

    windows是计算机系统中的什么系统(windows是计算机语言吗)

  • vivo手机的手电筒在哪(VIVO手机的手电筒在哪里)

    vivo手机的手电筒在哪(VIVO手机的手电筒在哪里)

  • 小米指纹锁sn码在哪(小米指纹锁sn码查询)

    小米指纹锁sn码在哪(小米指纹锁sn码查询)

  • mp3用手机怎么下歌曲(mp3用手机怎么下载歌)

    mp3用手机怎么下歌曲(mp3用手机怎么下载歌)

  • 苹果7p双卡双待吗(苹果7p双卡?)

    苹果7p双卡双待吗(苹果7p双卡?)

  • ios13已启用缩放怎么关闭(iphone显示已启用缩放)

    ios13已启用缩放怎么关闭(iphone显示已启用缩放)

  • 剪映怎么截取音乐片段(剪映怎么截取音乐片段往前提)

    剪映怎么截取音乐片段(剪映怎么截取音乐片段往前提)

  • 华为荣耀9x有没有分屏功能(华为荣耀9x有没有红外线遥控功能)

    华为荣耀9x有没有分屏功能(华为荣耀9x有没有红外线遥控功能)

  • 全视频tv怎么下载到手机上

    全视频tv怎么下载到手机上

  • 早教机如何连wifi(智能早教机怎么联网)

    早教机如何连wifi(智能早教机怎么联网)

  • 凤尾蕨的养殖方法和注意事项(凤尾蕨的养殖方法)

    凤尾蕨的养殖方法和注意事项(凤尾蕨的养殖方法)

  • 无法修改系统时间怎么办(win10我无法更改某些设置)

    无法修改系统时间怎么办(win10我无法更改某些设置)

  • 利用Matlab进行图像分割和边缘检测(利用matlab作图)

    利用Matlab进行图像分割和边缘检测(利用matlab作图)

  • 小型微利企业所得税减免政策
  • 车船税是否每年都交
  • 农产品收购发票使用范围
  • 汇总记账凭证会计核算形式与科目汇总表
  • 处置资产开啥发票
  • 公司财务外包费怎么入账
  • 所得税可以预交吗现在
  • 个体工商户取得经营所得的个人自行申报缴纳个人所得税
  • 加工费的计提工资账务处理
  • 申请补贴费用怎么写
  • 销货清单怎么写才正规
  • 偿债基金公司债
  • 公司闲置房租出去违法吗
  • 金税盘技术服务费可以全额抵扣吗
  • 个人所得税扣除的
  • 金三地税系统如何安装客户端插件?
  • 火车票飞机票计入什么费用
  • 外币结算方式有哪几种
  • 旅游服务税目
  • 电动车固定资产报废年限是多少年
  • 资金账簿印花税税率
  • 征信费用会计分录
  • 以前年度费用如何列支
  • 如何使用快捷键截屏电脑
  • 清理缓存网页电脑
  • 所有者权益变动表范本
  • linux压缩.gz
  • win10系统宽带连接错误720
  • 办公室装修费怎么入账
  • 海关进口增值税如何入账
  • 企业重组特殊性税务处理计税基础
  • thinkphp 快速入门
  • uniapp实战视频教程
  • 企业所得税纳税义务发生时间
  • 劳务费怎么做会计分裤
  • 数据挖掘技术介绍
  • php 输出
  • 材料合理损耗会计处理
  • 帝国cms功能
  • 母公司与子公司交易属于关联交易吗
  • 建账在1月份如何录入期初
  • 如何查询去年企业所得税
  • 应收补贴款是什么
  • 非货币性资产交换是企业经常发生的
  • 收据可以当发票吗?
  • 哪些公司可以开电费发票
  • sqlserver实现离散组合算法
  • 建筑公司收到劳务发票会计分录
  • 计算业务招待费扣除限额的基础包括营业外收入
  • 小规模纳税人征收率5%的情况
  • 附加税减半征收实例账务处理
  • 购进固定资产没有发票怎么入账
  • 财务费用为什么是向债权人支付的现金流量
  • 复利现值系数表怎么算
  • 事业单位公务员考试条件
  • 预付一年房租费的会计分录
  • 航天信息开票软件客服
  • 城镇土地使用税减免税政策
  • 所得税费用如何计提
  • 案例如何分析
  • win10系统预览版
  • xp系统下载文件没有出现下载对话框让你选择保存的位置
  • winton
  • win8使用手册
  • linux给文件赋予权限
  • recyclerview addview
  • js cocos
  • Unity3D游戏开发引擎
  • css盒子模型示意图
  • html中滚动条
  • linux查看远程服务是否开启
  • jquery按钮点击事件
  • 网管系统怎么用
  • 讲解JavaScript中for...in语句的使用方法
  • Android应用程序可以直接在ios中安装运行吗
  • 特岗教师服务期满证书
  • 广东国家税务局网上税务服务大厅
  • 上海市信访局官网首页
  • 怎么查询小米手机位置
  • 青岛市医保网上办事大厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设