• 设计模式总结篇系列:适配器模式(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 }

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

     

     

  • 相关阅读:
    软工实践个人总结
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用(含选做)
    2020软工实践第二次结对作业
    mocha单元测试简单教程
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    福州大学软件工程实践第一次个人编程作业
    实验 3:Mininet实验 —— 测量路径的损耗率
    实验 2:Mininet 实验——拓扑的命令脚本生成
  • 原文地址:https://www.cnblogs.com/lwbqqyumidi/p/3750128.html
Copyright © 2020-2023  润新知