文档章节

java设计模式-适配器模式

走世界
 走世界
发布于 2017/09/06 01:22
字数 927
阅读 10
收藏 0
点赞 0
评论 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

适配器模式的优缺点

优点

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

缺点

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

适配器模式的使用场景

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

© 著作权归作者所有

共有 人打赏支持
走世界
粉丝 3
博文 96
码字总数 91434
作品 0
和平
程序员
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗 ⋅ 05/08 ⋅ 0

java开发中的常用的设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

qq_38024548 ⋅ 05/28 ⋅ 0

Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei ⋅ 05/26 ⋅ 0

Java 设计模式 之 单例模式 Singleton 实际应用

Java 设计模式 之 单例模式 Singleton 实际应用 http://www.verejava.com/?id=16998954233354

verejava ⋅ 05/24 ⋅ 0

【唯品会】设计模式在特卖会的应用与思考

设计模式在特卖会的应用与思考 无心之心,道之所存 --《建筑的永恒之道》 1、开篇 之所以讨论设计模式,是因为当前我们都明白它可以提供优雅的解决方案,有利于在团队项目中建立共识,并且无...

暗夜在火星 ⋅ 2016/11/12 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

Java篇-接口interface关键字

一 : interface关键字 接口是与类并行的一个概念 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,...

TianTianBaby223 ⋅ 04/24 ⋅ 0

为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

⋅ 06/10 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

详解Proxy代理模式的场景分析

代理模式是一个十分优秀的软件架构模式,许多应用都用到了代理模式。代理模式就是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不合适或者不能直接引用另一个对象,...

Java架构 ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

阿里云云栖社区 ⋅ 今天 ⋅ 0

zabbix短信报警统计以及报表展示

一、需求 由于我们的业务报警比较频繁,之前是针对每个报警进行具体处理,但是有时还会重复出现,或者后续处理有时忘记跟进等,因此进行报警短信的统计,可以针对一些问题与业务跟进,明确后...

o翡翠谷o ⋅ 今天 ⋅ 0

JNI 输出LOG

1、导入log头文件。在你使用的 .c/ .cpp 文件中,导入 log.h 头文件。 #include<android/log.h> 2、在android.mk 加上 LOCAL_LDLIBS := -llog 或 LOCAL_SHARED_LIBRARIES := liblog 3、定义L......

国仔饼 ⋅ 今天 ⋅ 0

主线程pthread_exit 作用

#include <iostream>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 10void* say_hello(void* args){ int i = *((int*)args);/......

xxdd ⋅ 今天 ⋅ 0

崛起于Springboot2.X之Mybatis-xml方式操作mysql数据库(3)

序言:当第一篇讲道Mybatis的时候,只要使用过mybatis的java程序员100%都会知道这种方式,因为这是最广泛最全面的编写sql操作mysql数据库的方式,高级sql的编写往往通过xml方式,接下来进入正...

木九天 ⋅ 今天 ⋅ 1

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

猫耳m ⋅ 今天 ⋅ 0

spring elasticsearch 2.4 date 日期

1.mappingPUT user_behavior { "mappings": { "user_behavior": { "properties": { "date": { "type": "createDate", ......

xiaomin0322 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部