设计模式总结篇系列:适配器模式(Adapter)

简介:

网上看到不少关于适配器模式的讲解,其中对于适配器模式解释的过于专业,一时不是特别理解适配器模式到底是用来干嘛的,具体的适用场景在哪,其最精髓的地方到底在哪。

本文结合自己的理解,阐述下对适配器模式的看法。

假设系统存在一个现有的类UserInfo:

复制代码
 1 class UserInfo {
 2 
 3     private Map<String, String> userBaseInfo;
 4 
 5     public Map getUserBaseInfo() {
 6         return userBaseInfo;
 7     }
 8 
 9     public void setUserBaseInfo(Map<String, String> userBaseInfo) {
10         this.userBaseInfo = userBaseInfo;
11     }
12 }
复制代码

客户端可以通过如下方式set、get员工基本信息:

复制代码
 1 public class AdapterTest {
 2 
 3     public static void main(String[] args) {
 4         
 5         UserInfo oui = new UserInfo();
 6         Map<String, String> inUserInfo = new HashMap<String, String>() {
 7             {
 8                 put("name", "corn");
 9                 put("telNumber", "170xxxxxxxx");
10             }
11         };
12         oui.setUserBaseInfo(inUserInfo);
13 
14         // 原有取得员工基本信息的方式
15         Map<String, String> outUserInfo = oui.getUserBaseInfo();
16         String name = outUserInfo.get("name");
17         String telNumber = outUserInfo.get("telNumber");
18         
19     }
20 }
复制代码

有一天,基于某种原因(也许你看着这种取数据的方式不太爽,也许是系统间数据交换的原因等),你需要按照如下接口的方式取数据:

目标员工接口:

复制代码
1 interface UserInterface {
2 
3     public String getName();
4 
5     public String getTelNumber();
6 
7 }
复制代码

那么,现在的问题是,如何将一个既定的类转换成按照目标接口的所期望的行为形式呢?

 

具体怎样实现呢,可以通过如下方式进行:

复制代码
 1 class UserAdapter extends UserInfo implements UserInterface {
 2 
 3     @Override
 4     public String getName() {
 5         return (String) super.getUserBaseInfo().get("name");
 6     }
 7 
 8     @Override
 9     public String getTelNumber() {
10         return (String) super.getUserBaseInfo().get("telNumber");
11     }
12 
13 }
复制代码

从上面的UserAdapter类定义中我们发现,UserAdapter不仅实现了UserInterface接口,同时还继承了UserInfo类。在实现接口的getName()和getTelNumber()方法中,分别调用了UserInfo类中的相应方法并取得结果。由此可以满足需求。在上述定义中,按照UserInterface、UserInfo和UserAdapter在场景中的目的不同,可以具体划分成如下角色:

UserInterface:目标角色——目标接口,系统所期待实现的目标;

UserInfo:源角色——当前已经存在的原有的实现类,即将被适配的类;

UserAdapter:适配器角色——将原有实现装换为目标接口的实现。

简单点说,适配器模式是指:定义一个类,将一个已经存在的类,转换成目标接口所期望的行为形式。

在具体的实现过程中,又可以基于其实现层次是类层次还是对象层次,将其分为类适配器和对象适配器。如上所写的是类适配器。

对象适配器使用组合代替继承,将源角色视为适配器角色的属性:

复制代码
 1 class UserAdapter implements UserInterface {
 2     
 3     private UserInfo userInfo;
 4     
 5     public UserAdapter(){
 6         
 7     }
 8     
 9     public UserAdapter(UserInfo userInfo){
10         this.userInfo = userInfo;
11     }
12 
13     @Override
14     public String getName() {
15         return (String) userInfo.getUserBaseInfo().get("name");
16     }
17 
18     @Override
19     public String getTelNumber() {
20         return (String) userInfo.getUserBaseInfo().get("telNumber");
21     }
22 
23 }
复制代码

总体而言:适配器模式是指定义一个适配器类,将一个已经存在的类,转换成目标接口所期望的行为形式。同时,一般来说,基于更多的推荐使用组合而不是继承,因此,对象适配器可能使用更多。

 

 

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类: 设计模式

本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3750128.html,如需转载请自行联系原作者
目录
相关文章
|
23天前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
4月前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
3月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
65 0
|
4月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
5月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
|
7月前
|
设计模式
适配器模式-大话设计模式
适配器模式-大话设计模式
|
6月前
|
设计模式 Go 数据处理
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
|
6月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 适配器模式
js设计模式【详解】—— 适配器模式
44 0
|
7月前
|
设计模式 Java Android开发
Java设计模式:适配器模式的三种形式(五)
Java设计模式:适配器模式的三种形式(五)
|
7月前
|
设计模式 Java
Java设计模式之适配器模式详解
Java设计模式之适配器模式详解