取消关注

 
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. 花里胡哨之自定义linux终端前缀显示

    文章目录 1.先看默认的linux终端前缀 2.查看默认的终端前缀变量 3.符号所代表的意义 4.修改PS1变量,达成自定义效果 4.1.只显示主机名和完整目录 4.2.给他点颜色看看 5.谢幕 1. ...

  2. validator参数校验

    目录 validator参数校验 validator参数校验 type Req struct { Sn string `json:"sn" binding:"requir ...

  3. for循环例子

    代码 点击查看[ForTest.java]代码 //package com.d; import java.util.Scanner; /** * For循环例子 * @date: 2022.2.24 ...

  4. Remix本地化,加载本地合约文件,本地链接Remix

    智能合约IDE,在线的比较卡,而且切换网络面临文件丢失的风险,选择本地搭建Solidity本地编辑环境,Remix-IDE + Remixd组合,加载本地合约代码.这里用到两个工具: Remix ID ...

  5. BI能给企业带来什么收益,企业应该如何选择好的BI工具?

    ​任何从事数据分析的小伙伴,或多或少都会听说BI这个数据分析工具.希望进入数据分析工作的小伙伴也一定绕不开BI这个话题,那么BI到底是什么呢?为什么BI如此重要?BI能给企业带来什么?如何选择BI工具 ...

  6. 使用PLSQL 创建Oracle数据库用户并设置权限

    转至https://blog.csdn.net/ying890/article/details/14083029?utm_medium=distribute.pc_relevant_download. ...

  7. matplotlib补充知识及数据清理方法

    今日内容概要 数据操作 数据清洗理论 数据清洗实操 数据操作 read_csv read_excel read_hdf read_html read_json read_msgpack read_sq ...

  8. Python简单入门心得(一)

    很久之前就对Python感兴趣了,但是一直没时间学习,最近两天还有点时间,于是网上看了下视频,Python不愧是强类型的编程语言,对每一行的缩进的都有很严格的要求,比如一个判断,如果条件语句else不 ...

  9. MM32F0140 UART1中断接收和UART1中断发送

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...

  10. Python自动化 unittest生成测试报告(HTMLTestRunner)03

    批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTest ...