博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式总结篇系列:适配器模式(Adapter)
阅读量:7237 次
发布时间:2019-06-29

本文共 2656 字,大约阅读时间需要 8 分钟。

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

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

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

1 class UserInfo { 2  3     private Map
userBaseInfo; 4 5 public Map getUserBaseInfo() { 6 return userBaseInfo; 7 } 8 9 public void setUserBaseInfo(Map
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
inUserInfo = new HashMap
() { 7 { 8 put("name", "corn"); 9 put("telNumber", "170xxxxxxxx");10 }11 };12 oui.setUserBaseInfo(inUserInfo);13 14 // 原有取得员工基本信息的方式15 Map
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     @Override14     public String getName() {15         return (String) userInfo.getUserBaseInfo().get("name");16     }17 18     @Override19     public String getTelNumber() {20         return (String) userInfo.getUserBaseInfo().get("telNumber");21     }22 23 }

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

 

 

转载地址:http://lxofm.baihongyu.com/

你可能感兴趣的文章
正则:此处用到字符串的replace方法
查看>>
什么是css?
查看>>
webpack 打包多页面
查看>>
傻瓜式入门Redux
查看>>
最新图解 如何提升phpstudy中的mysql版本
查看>>
华山论剑之iOS&tableView的双剑合璧
查看>>
4K超清,2500万人在线,猫晚直播技术全解读
查看>>
编译时注解 ButterKnife源码分析和手写
查看>>
人人都能学会的python编程教程2:数据类型和变量
查看>>
iOS开发: CocoaPods远程私有仓库的维护-添加子库
查看>>
【Python3网络爬虫开发实战】3-基本库的使用-3正则表达式
查看>>
支持获取 6.0+设备正在运行程序信息
查看>>
使用 Acorn 来解析 JavaScript
查看>>
如何下载、安装eclipse
查看>>
流计算框架 Flink 与 Storm 的性能对比
查看>>
JavaScript数据类型AND深拷贝和浅拷贝的不归路
查看>>
iOS逆向之旅(进阶篇) — HOOK(FishHook)
查看>>
Gradle 3.0.0设置Apk文件输出命名
查看>>
mac 使用php storm的基本配置
查看>>
装饰者模式
查看>>