取消关注

 
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. suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件

    文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...

  2. Hadoop分布式集群部署

    环境准备 IP HOSTNAME SYSTEM 192.168.131.129 hadoop-master CentOS 7.6 192.168.131.135 hadoop-slave1 CentO ...

  3. DotNet Dictionary 实现简介

    一:前言 本来笔者对DotNet的Hashtable及Dictionary认识一直集中在使用上,一个直接用object 一个可以用泛型,以前也只大概看过Hashtable的实现.最近查MSDN时发现有 ...

  4. IE内核 播放 RTMP 视频

    VLC IE ActiveX 方式播放 需IE内核支持(IE或者双核浏览器). VLC 下载地址https://www.videolan.org/vlc/ 页面视频窗口 <div id=&quo ...

  5. 思科VTP协议(后面有配置案例)

    一.VTP相关理论介绍 1.1 VTP(VLAN trunking protocol)协议是用来在整个交换网络中分发和同步VLAN数据库的,是一个二层协议,思科私有协议. 1.2 VTP域是由一台或者 ...

  6. HTTP攻击与防范-PHP安全配置

    实验目的 1.了解PHP攻击带来的危险性. 2.掌握PHP攻击的原理与方法 3.掌握防范攻击的方法 实验原理 由于网站服务器是以单一系统使用者的模式在运行,因此这个系统的使用者账号必须能够读取每个使用 ...

  7. 【C# 异常处理】 开端

    异常概述 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是 ...

  8. 【C#反射】动态创建类型实例

    转载自:https://www.cnblogs.com/dytes/archive/2012/06/29/2569488.html .NET中除了构造函数外,还有多种方式可以创建类型的实例.下面总结了 ...

  9. 有关SQL(2012)突然无法连接服务器的问题解答

    Sql Server无法启动的4中原因:(先得分析出问题所在) 原文地址:http://www.cnblogs.com/JiangLe/p/4000497.html SQL Server 无法启动的原 ...

  10. Ocelot和IdentityServer4初体验

    Ocelot是一个用.NET Core实现的开源API网关技术.IdentityServer4是一个基于OpenID Connect和OAuth2.0的针对ASP.NET Core的框架,以中间件的形 ...