适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码。

适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比。

在设计面向对象的应用程序时,当我们的客户希望使用特定类型的对象并且我们有一个第三方API提供相同的功能但通过不兼容的接口时,我们可能会感到需要适配器


它也被称为包装器,因为它通过一个新接口包装现有代码,使其与客户端兼容。

术语:

让我们知道在谈论适配器模式时使用的术语:

  • 客户端:要使用第三方库或外部系统的类
  • Adaptee:我们要使用的第三方库或外部系统中的类
  • 目标接口:客户端将使用的所需接口
  • 适配器:此类位于客户端和适配器之间,并实现目标接口

使用适配器模式:

假设我们有一个ShopInventory ,其中维护着一个产品列表。 后来,我们接管了另一家出售杂货的商店库存。 现在,我们要将这些项目添加到ShopInventory中 。 我们这里存在的问题是,尽管GroceryItem只是一种产品,但与Product接口无关。

为了解决这个问题,我们将使用适配器模式。 我们将创建一个GroceryItemAdapter ,它将实现Product接口:


借助适配器,我们现在可以将GroceryItem视为产品,而无需更改第三方代码( GroceryItem )中的任何内容。

Java实现:

首先定义一个Product和一个ShopInventory类:

public interface Product {String getName();double getPrice();
}public class ShopInventory {private List<Product> products;public ShopInventory() {this.products = new ArrayList<>();}public void addProduct(Product product) {this.products.add(product);}public void removeProduct(Product product) {this.products.remove(product);}
}

我们刚刚接管的第三方商店拥有GroceryItem

//third-party code
public class GroceryItem {String itemName;int costPerUnit;//constructor, getters and setters
}

由于我们的ShopInventory只保存Product类型的项目,因此我们为新引入的GroceryItem创建一个适配器:

public class GroceryItemAdapter implements Product {private GroceryItem groceryItem;public GroceryItemAdapter(GroceryItem groceryItem) {this.groceryItem = groceryItem;}public String getName() {return groceryItem.getItemName();}public double getPrice() {return groceryItem.getCostPerUnit();    }
}

这样,我们现在可以将我们的常规产品和杂货添加到我们的ShopInventory中:

//code in our main method
ShopInventory inventory = new ShopInventory();//adding regular store products - ones that implement Product interface
inventory.addProduct(new CosmeticProduct("Lavie Handbag", 5000.0));
inventory.addProduct(new FitnessProduct("Yoga SmartFit", 2000.75));//adding GroceryItem to the store using an adapter
GroceryItem groceryItem = new GroceryItem("Wheat Flour", 100);
inventory.addProduct(new GroceryItemAdapter(groceryItem));

结论:

适配器模式可帮助我们连接两个不兼容的接口,以显示相同的业务功能。

使用适配器模式,我们将现有接口转换为客户端代码期望的另一个接口。

翻译自: https://www.javacodegeeks.com/2019/08/adapter-design-pattern-in-java.html

Java中的适配器设计模式相关推荐

  1. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  2. Java中的策略设计模式

    策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...

  3. Java中的命令设计模式

    在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...

  4. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  5. Java中的Memento设计模式-示例教程

    记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保 ...

  6. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

  7. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  8. Java中的迭代器设计模式–示例教程

    迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...

  9. Java中的生成器设计模式

    Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式. 在学习任何设计模式之前,我建议先找出特定设计模式要解决的问题. 众所周知, 必要 ...

最新文章

  1. 爱情也许是最忧伤的童话
  2. markdown语法中的空格_Markdown常用语法汇总
  3. 垂直网站架构改造 - 怎样成为一个山寨CTO
  4. React Native的TextInput组件去掉下划线和使用背景图片
  5. 【深度学习入门到精通系列】神经网络中动量的概念
  6. 循序渐进,学习开发一个RISC-V上的操作系统 5.1答案
  7. 前端学习(2519):路由和请求
  8. if else的使用以及如何从键盘获取数值
  9. c语言fgets函数的用法
  10. 第6章 旋转的方块(《Python趣味创意编程》教学视频)
  11. 开课吧:怎样才能做软件架构师?
  12. asp.net控件开发学习(1)
  13. SIP协议及与Freeswitch的关系
  14. 人脸识别像素最低_人脸识别的技术要求
  15. 新员工入职表_医院新员工入职培训怎么做?
  16. android actionbar setCustomView时布局整体右移解决方案
  17. win10街头篮球服务器维护中,win10系统玩街头篮球游戏延迟不顺畅的处理技巧
  18. 为什么要学习平面设计的几个理由
  19. Flutter 3.0 极光推送
  20. 在VS Code中开发ESP32遇到如下IDF_PATH环境变量不一致的警告问题

热门文章

  1. ssl1626-花店橱窗布置【日常dp】
  2. 31、JAVA_WEB开发基础之servlet(2)
  3. Mysql中的行级锁、表级锁、页级锁
  4. Java剪切板操作大全
  5. Oracle入门(十二H)之设置、恢复和删除不可用列
  6. 1分钟了解区块链的本质
  7. 调用阿里云接口实现短信消息的发送源码——CSDN博客
  8. Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
  9. css实现一级下拉菜单
  10. JS中函数的prototype属性和对象的__proto__属性