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

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

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

 class UserInfo {

     private Map<String, String> userBaseInfo;

     public Map getUserBaseInfo() {
return userBaseInfo;
} public void setUserBaseInfo(Map<String, String> userBaseInfo) {
this.userBaseInfo = userBaseInfo;
}
}

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

 public class AdapterTest {

     public static void main(String[] args) {

         UserInfo oui = new UserInfo();
Map<String, String> inUserInfo = new HashMap<String, String>() {
{
put("name", "corn");
put("telNumber", "170xxxxxxxx");
}
};
oui.setUserBaseInfo(inUserInfo); // 原有取得员工基本信息的方式
Map<String, String> outUserInfo = oui.getUserBaseInfo();
String name = outUserInfo.get("name");
String telNumber = outUserInfo.get("telNumber"); }
}

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

目标员工接口:

 interface UserInterface {

     public String getName();

     public String getTelNumber();

 }

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

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

 class UserAdapter extends UserInfo implements UserInterface {

     @Override
public String getName() {
return (String) super.getUserBaseInfo().get("name");
} @Override
public String getTelNumber() {
return (String) super.getUserBaseInfo().get("telNumber");
} }

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

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

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

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

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

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

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

 class UserAdapter implements UserInterface {

     private UserInfo userInfo;

     public UserAdapter(){

     }

     public UserAdapter(UserInfo userInfo){
this.userInfo = userInfo;
} @Override
public String getName() {
return (String) userInfo.getUserBaseInfo().get("name");
} @Override
public String getTelNumber() {
return (String) userInfo.getUserBaseInfo().get("telNumber");
} }

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

最新文章

  1. 用SQL命令查看Mysql数据库大小
  2. angularjs指令系统系列课程(3):替换replace,内容保留transclude,作用方式restrict
  3. PoEdu - C++阶段班【Po学校】- 第3天
  4. java-获取随机字符串
  5. HDU 1712 裸分组dp
  6. [BZOJ2959]长跑——新技能:LCT+缩圈
  7. BZOJ 1036 &amp;&amp; 树链剖分
  8. DOS批处理命令-注释
  9. Python字符串内建处理函数
  10. 模仿ios下的coverflow
  11. Math.round()、Math.ceil()、Math.floor()与Math.random()的区别?
  12. Objective C 链式调用
  13. Infragistics的介绍以及在ASP.net中使用的总结
  14. vim中文帮助文档安装
  15. 在Docker Hub上查找可用的Image映像
  16. USACO Training Section 1.1 题解(共4题)
  17. #学号 20175201张驰 《Java程序设计》第3周学习总结
  18. dll多个版本问题
  19. 软件架构设计学习总结(18):MVC三层架构在各框架(jsp+servlet + Struts1+ Struts2+ springMVC)中的特征
  20. KVM源代码阅读--内核版本3.17.4

热门文章

  1. Kafka 安装配置
  2. css3 图片阴影
  3. idea设置调用方法时提示方法注释
  4. 如何查找MySQL中查询慢的SQL语句(转载)
  5. Java基础——关于jar包的知识
  6. c#使用 Newtonsoft.Json 将entity转json时,忽略为null的属性
  7. node.js搭建Web服务器
  8. python—文件处理
  9. freemarker导出带图片的word文档
  10. 【RL-TCPnet网络教程】第9章 RL-TCPnet网络协议栈移植(uCOS-III)