文档章节

java设计模式-适配器模式

走世界
 走世界
发布于 2017/09/06 01:22
字数 927
阅读 10
收藏 0

    适配器模式有两种类型,类适配器模式对象适配器模式。由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而C#、java等语言都不支持多重继承,因而这里只是介绍对象适配器。

适配器模式官方定义

    将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

个人理解

    举个栗子,假如我现在有钱了,去巴厘岛去旅游。当地提供的住宿环境是那种欧式的插线板,但我手机充电器是中国通用的那种两个插线头。在这种情况下我手机已经没电了必须要充电,担我直接充不了怎么办。去当地的超市买来了一个转接头,拿回住的地方用转接头就可以充电了。网上这张图给我启发很大如下

    转接头(Adapter模式)使得原本由于插头与线板(接口)不兼容而不能一起充电(工作)的那些线(类)可以在一起工作。

适配器模式中的角色

  • 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
  • 需要适配的类(Adaptee):需要适配的类或适配者类。
  • 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 

实现方法看看效果 

    公司现在是做自己产品(速),但是老板发现一个新的商机又开发出来一个新的产品(玩)。希望在(玩)产品上同事可以看到(速)产品中的用户。但由于两个产品不是同一技术团队研发的。在技术与开发规范中都不是很统一。适配器模式就是要解决这样的问题

代码清单:(玩)用户信息接口

public interface IUserInfo {
    public String getUserName();
    public String getUserPhone();
    public String getUserJobPosition();
}

代码清单:(玩)用户信息实现方法

public class UserInfo implements IUserInfo {
    @Override
    public String getUserName() {
        System.out.println("张三");
        return null;
    }

    @Override
    public String getUserPhone() {
        System.out.println("15811111111");
        return null;
    }

    @Override
    public String getUserJobPosition() {
        System.out.println("CEO");
        return null;
    }
}

代码清单:(速)用户信息实现方法

public class Perpersonnel {
    public Map getUserBasic(){
        HashMap<Object, String> userBasic = new HashMap<Object, String>();
        userBasic.put("UserName","王五");
        userBasic.put("UserPhone","18811111111");
        return userBasic;
    }
    public Map getUserJob(){
        HashMap<Object, String> userJobPosition = new HashMap<Object, String>();
        userJobPosition.put("JobPosition","CTO");
        return userJobPosition;
    }
}

代码清单:主角适配器

public class UserInfoAdapter extends Perpersonnel implements IUserInfo{
    public String getUserName() {
        String userName = (String) getUserBasic().get("UserName");
        System.out.println(userName);
        return userName;
    }
    public String getUserPhone() {
        String UserPhone = (String) getUserBasic().get("UserPhone");
        System.out.println(UserPhone);
        return UserPhone;
    }
    public String getUserJobPosition() {
        String JobPosition = (String) getUserJob().get("JobPosition");
        System.out.println(JobPosition);
        return JobPosition;
    }
}

代码清单:(玩)产品上查询两个产品的用户信息

public class Test {
    public static void main(String[] args) {
        IUserInfo iuserInfo = new UserInfo();
        iuserInfo.getUserName();
        iuserInfo.getUserPhone();
        iuserInfo.getUserJobPosition();

        System.out.println("---------------------");

        IUserInfo iuserInfoAdapter = new UserInfoAdapter();
        iuserInfoAdapter.getUserName();
        iuserInfoAdapter.getUserPhone();
        iuserInfoAdapter.getUserJobPosition();

    }
}

查询出来的结果如下:

张三
15811111111
CEO
---------------------
王五
18811111111
CTO

适配器模式的优缺点

优点

  • 适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就成。
  • 增加了类的透明性
  • 提高了类的复用度
  • 灵活性非常好

缺点

  • 对于对象适配器来说,更换适配器的实现过程比较复杂。

适配器模式的使用场景

    适配器模式的使用场景主要记住一点就足够了:你想修改一个已经投产中的接口時,适配器模式可能是最适合你的模式。

© 著作权归作者所有

共有 人打赏支持
走世界
粉丝 5
博文 96
码字总数 91434
作品 0
和平
程序员
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0
设计模式: Java中的工厂设计模式

原文链接 https://github.com/shellhub/blog/issues/22 前言 工厂设计模式(Factory Design Pattern)属于创建模式之一,工厂设计模式在JDK,Spring,Stuts被广泛使用 当一个类或者接口有多个子类...

shellhub
08/22
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

防止快速重复点击的两种思维

防止重复执行的两种思维 场景 下单时,提交按钮,因为网络卡顿或者手快重复点击,导致重复提交订单; 微博,更新个人状态或发表评论时,快速多次点击[发送]按钮,导致相同的信息发送多次. 解决思路 ...

黄威
20分钟前
0
0
在windows环境下使用Virtualbox虚拟Debian系统来运行Docker

标题绕口。 我之前一直使用 Virtualbox 和 homestead 来运行我的 PHP 开发环境。最近决心开始尝试 DevOps,使得开发、部署容器化,来化解人为操作失误和环境不兼容等问题造成的各种损失。就打...

zgldh
22分钟前
0
0
python map()

map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。(利用生成器的原理,并不马上返回值,...

南桥北木
36分钟前
0
0
分享几个 SpringBoot 实用的小技巧

前言 最近分享的一些源码、框架设计的东西。我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多;这次就分享一点接地气的: SpringBoot 使用中的一些小技巧。 算不上多高大上...

Java干货分享
36分钟前
1
0
day123-20181021-英语流利阅读-待学习

这款新字体,比记忆面包还管用 Lala 2018-10-21 1.今日导读 字体能跟学习效果有什么关系?你还别说,来自澳洲的心理学家和设计师们,还真创造了一款号称能够帮助大家记忆信息、增强学习效果的...

飞鱼说编程
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部