取消关注

 
2 人赞同了该文章

1. 适配器模式定义:

适配器模式是一种结构型设计模式,通过一个适配器类把具有不同方法功能的两个类A和B组合起来,使得这个适配器类同时具有两个类的不同的功能,调用方不管要使用A类的功能还是B类的功能,都可以通过调用适配器类来实现,不用再分别调用A和B;

举个栗子

用户新买了一件两孔插座的电器,但是家里只有一个三孔插座,这个时候怎么办呢?可以再买一个插座适配器,来做转化,把适配器插到三孔插座上,用户直接把电器插到适配器即可

主要角色:源对象,目标对象,适配器

2. 适配器分类

2.1 类适配器模式

通过继承特性来实现适配器功能,继承实现关系如下

源对象

/**
* 两孔插座
*/
public class TwoHoleSocket {
public void twoHole() {
System.out.println("插入两孔插座");
}
}

目标对象

/**
* 三孔插座
*/
public interface ThreeHoleSocket {
void threeHole();
}

适配器

/**
* 适配器:可以同时使用两孔和三孔插座
*/
public class Adapter extends TwoHoleSocket implements ThreeHoleSocket{
@Override
public void threeHole() {
System.out.println("插入三孔插座");
} public static void main(String[] args) {
Adapter adapter = new Adapter();
adapter.twoHole();//使用两孔插座
adapter.threeHole();//使用三孔插座
}
}

2.2 对象适配器模式

通过组合关系来实现适配器功能,ThreeHoleSocket和TwoHoleSocket没有变化

/**
* 适配器
*/
public class Adapter implements ThreeHoleSocket{
//通过组合持有两孔插座的对象,内部引用两孔插座来适配
private TwoHoleSocket twoHoleSocket; public Adapter(TwoHoleSocket twoHoleSocket) {
this.twoHoleSocket = twoHoleSocket;
} public void twoHole() {
twoHoleSocket.twoHole();
} @Override
public void threeHole() {
System.out.println("插入三孔插座");
} public static void main(String[] args) {
Adapter adapter = new Adapter(new TwoHoleSocket());
adapter.twoHole();//两孔插座
adapter.threeHole();//三孔插座
}
}

2.3 接口适配器模式

接口适配器模式也称作缺省适配模式,就是有时候一个接口的方法太多,我只想用其中的一两个,不想为其他方法提供实现,就可以通过一个抽象类为这个接口的所有方法,提供空实现,如果想用哪个方法,再提供一个子类继承这个抽象类,覆盖父类某个方法即可;

举个栗子:墙上有一个插座,支持三孔,两孔,和支持usb插口,但是我考虑到安全问题,不想把三孔和两孔插口暴漏出来,只留一个usb插口给手机充电用,应该怎么做呢?

插座接口

/**
* 墙上插座
*/
public interface HallSocket {
//两孔插口
void twoHole();
//三孔插口
void threeHole();
//usb插口
void usbHole();
}

缺省实现类

/**
* 抽象类:提供缺省实现
*/
public class AbstractAdapter implements HallSocket{
@Override
public void twoHole() { } @Override
public void threeHole() { } @Override
public void usbHole() { }
}

目标子类

public class UsbSocket extends AbstractAdapter{
@Override
public void usbHole() {
System.out.println("usb插口");
} //测试
public static void main(String[] args) {
UsbSocket usbSocket = new UsbSocket();
usbSocket.usbHole();
}
}

2.4 三种适配器模式的区别

  • 类适配器模式:通过继承源类,实现目标接口的方式实现适配,但是由于Java单继承的机制,这就要求目标必须是接口,有一定的局限性
  • 对象适配器模式,通过组合方式持有源类对象,可以把源类对象子类传进来,比类适配器模式更灵活
  • 接口适配器模式,借助中间抽象类空实现目标接口所有方法,子类选择性重写,可以减少实现不必要方法

java三种适配器模式详解与代码实现的更多相关文章

  1. [转]hibernate三种状态详解

    本文来自 http://blog.sina.com.cn/u/2924525911 hibernate 三种状态详解 (2013-04-15 21:24:23) 转载▼   分类: hibernate ...

  2. 多表连接的三种方式详解 hash join、merge join、 nested loop

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...

  3. 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾

    https://mp.weixin.qq.com/s/67NvEVljnU-0-6rb7MWpGw 分布式事务 Seata Saga 模式首秀以及三种模式详解 | Meetup#3 回顾 原创 蚂蚁金 ...

  4. Android 三种动画详解

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.点我开始Android技术交流] 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让 ...

  5. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  6. Hibernate 的三种状态详解

    hibernate的对象有3种状态,分别为:瞬时态(Transient).持久态(Persistent).脱管态(Detached). 处于持久态的对象也称为PO(Persistence Object ...

  7. IDEA三种注释详解

    三种注释方式 行注释.块注释.方法或类说明注释. 一.快捷键:Ctrl + / 使用Ctrl+ /, 添加行注释,再次使用,去掉行注释 二.演示代码 if (hallSites != null &am ...

  8. Linux如何让进程在后台运行的三种方法详解

    问题分析: 我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程.因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运 ...

  9. 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...

随机推荐

  1. c++ 程序编译后运行时的内存分配

    程序编译后运行时的内存分配 太好的文章了,看到不得不转,转自:http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html 一.编译时与运行时的内存情况 1 ...

  2. WebGL 与 WebGPU比对[5] - 渲染计算的过程

    目录 1. WebGL 1.1. 使用 WebGLProgram 表示一个计算过程 1.2. WebGL 没有通道 API 2. WebGPU 2.1. 使用 Pipeline 组装管线中各个阶段 2 ...

  3. 微信小程序实现文本的展开与收起

    致谢 https://www.jianshu.com/p/9458083214cc 效果图   代码 js部分 // pages/volunteer/active/info/activeInfo.js ...

  4. RENIX报文字段跳变——网络测试仪实操

    什么是报文字段跳变? 报文字段跳变是指字段的值进行一些列有规则的变化,Renix支持对字段进行递增.递减.列表和随机变化. 如当用户想要仿真大量的源IP变化的数据时,就可以使用Modifier进行规则 ...

  5. OpenStack学习系列之十二:安装ceph并对接OpenStack

        Ceph 是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.Ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环境中,通常 ...

  6. 跟Excel说拜拜,这款可视化报表制作工具入股不亏!

    ​相信很多人如果看到漂亮的图表都会很感叹,"为什么可以做的这么漂亮,这么好看?","这个应该怎么做呢?用什么工具可以实现呢?".制作漂亮的可视化一般有这样几个方 ...

  7. 国产BI报表工具中低调的优秀“模范生”——思迈特软件Smartbi

    首先简单来介绍一下这位低调且优秀的模范生--思迈特软件Smartbi.思迈特Smartbi是企业级商业智能BI和大数据分析品牌,满足用户在企业级报表.数据可视化分析.自助分析平台.数据挖掘建模.AI智 ...

  8. MySQL让人又爱又恨的多表查询

    1. 前言 在SQL开发当中,多表联查是绝对绕不开的一种技能.同样的查询结果不同的写法其运行效率也是千差万别. 在实际开发当中,我见过(好像还写过~)不少又长又臭的查询SQL,数据量一上来查个十几分钟 ...

  9. golang线程安全

    目录 1.golang的map是线程安全的吗?怎么安全使用map 2.线程独享什么,共享什么 3.进程状态转换 4.Log包线程安全吗? 5.写的循环队列是不是线程安全? 6.go协程线程安全吗 7. ...

  10. Hadoop - HA学习笔记

    Hadoop HA概述 工作要点 通过双NameNode消除单点故障 元数据管理方式需要改变:内存中各自保存一份元数据:Edits 日志只有 Active 状态的NameNode节点可以做写操作:两个 ...