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

  • 递延所得税抵消分录
  • 资源税的计税依据煤炭
  • 出售投资性房地产取得的收入
  • 不动产租赁服务的税率是多少
  • 支付宝企业账户的钱怎么取出来
  • 无形资产资本化加计扣除可抵扣暂时性差异
  • 预付款与定金的比例
  • 个人独资企业对公账户的钱可以转到私人账户吗
  • 外聘人员劳务费入什么科目
  • 房地产预售房收入如何缴纳增值税
  • 新增员工个人所得税申报表?
  • 支付单位结算卡年费计入什么科目
  • 另一个公司代付公司的水电费
  • 没通过认证的增值税发票是否能够记入成本抵扣
  • 燃气在建工程要怎么转固定资产呢?
  • 非独立核算的分公司是什么意思
  • 认可的发票验证怎么弄
  • 小规模纳税人3%减按1%的账务处理
  • 工程税票怎么开需要交多少
  • 分红未及时扣缴税款要缴滞纳金吗?
  • 政府委托代建的房地产公司是否可以开立农民工工资
  • 房租现金流量表选哪项比较合适
  • 金税盘需要报税吗
  • 现在还有餐饮许可证吗
  • 可转换债券赎回和回售如何理解
  • 产品入库的业务流程
  • 分公司可以独立诉讼吗
  • 什么是馥芮白
  • linux限制用户访问文件
  • Win7系统怎么禁用TDPF
  • 建筑企业挂靠账务怎么处理?
  • clipbrd.exe是什么意思
  • 往来账款如何做账务处理
  • 在缴纳企业所得税的情形
  • 房地产企业公司
  • css flaot
  • 交暖气费可以开单位发票吗
  • 企业向个人借款是否合法
  • 应收账款的作用及其管理意义
  • pnmdp
  • 2022年终总结
  • win11磁盘分区后不显示
  • 车保险费中的车险是什么
  • vue 动态tab
  • 职工薪资包括
  • phpcms v9用户手册
  • python搞自动化
  • fortify 安装
  • 房产增值税计税依据及计算方式
  • 土石方收据图片
  • 河南巩义黄河治理项目土方工程有哪些
  • 企业欠缴非税收据怎么写
  • 固定资产加速折旧的方法有哪些
  • 财政补贴收入要交增值税税率
  • 个体户查账征收和核定征收哪个好
  • 会计凭证借贷方哪个是收入
  • 银行汇票计入什么会计科目
  • 金税三期个税卸载流程
  • 收到的货款比实际货款多
  • 资金账簿印花税减半政策
  • 冲回去年收入会计分录
  • 维修费收入怎么结转销售成本
  • 技术服务费怎么做分录
  • 大白菜u盘备份win10教程
  • 苹果电脑旋转屏幕设置在哪里找
  • 写出10个linux系统操作命令和用法
  • centos启动卡在了启动界面
  • 如何配置linux
  • win8怎么打开蓝牙设置
  • win7系统和win8系统哪个好用
  • jquery width
  • c#7.0新语法
  • Unity3D游戏开发(第2版)
  • cmd读取d盘
  • Android EventBus实战
  • jquery click重复执行
  • javascript的基本语法
  • 税务新进公务员个人总结
  • 盼之代售怎么下载
  • 税务工作者发展现状
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设