Java适配器模式_动力节点Java学院整理
作者:zy 发布时间:2021-09-06 10:50:53
标签:Java,适配器模式
一.概念
适配器模式将一个接口转换成客户希望的另外一个接口。它使得原来由于接口不兼容而不能在一起工作的那些类可以一起工作。
二.UML
三.更加生动的例子
四.实例分析
去年买了一个本本,另外给本本配了罗技G1光电套。坑爹的是,光电套的鼠标是USB接口,键盘是PS2接口,可我的本本却没有PS2接口啊。于是跑到市场,淘了一个转接器。
于是乎,我抽象了这么几个类。
1.PS2Port(PS2接口)。
2.USBPort(USB接口)。
3.PS2ToUSB(对象适配器),将PS2接口装换成USB接口。
4.TestAdapter(测试类),客户端。
PS2Port
package com.bjpowernode.adapter;
/**
* PS2接口,圆口
* @author eason
*
*/
public interface PS2Port {
public void workWithPS2();
}
USBPort
package com.bjpowernode.adapter;
/**
* USB接口,U口
* @author eason
*
*/
public interface USBPort {
public void workWithUSB();
}
PS2ToUSB
package com.bjpowernode.adapter;
/**
* 对象适配器
* 将PS2接口装换成USB接口
* 所以此类类型是USB接口(implements USBPort) + 成员变量ps2Port
* @author eason
*
*/
public class PS2ToUSB implements USBPort{
private PS2Port ps2Port;
public PS2ToUSB(PS2Port ps2Port) {
this.ps2Port = ps2Port;
}
@Override
public void workWithUSB() {
System.out.println("转换的关键在这里,本来是");
ps2Port.workWithPS2();
System.out.println("经过你的转换,现在是USB工作中");
}
}
TestAdapter
package com.bjpowernode.adapter;
/**
* 测试类
* client
* @author eason
*
*/
public class TestAdapter {
public static void main(String[] args) {
//我现在有一个PS2接口
PS2Port ps2Port = new PS2Port() {
@Override
public void workWithPS2() {
System.out.println("PS2工作中");
}
};
//但是我需要的是一个USB接口啊,对我(client)来说,我只认识USB接口
//经过PS2ToUSB的转换,PS2接口变成了USB接口
USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);
ps2ToUsbPort.workWithUSB();
}
}
五.对象的适配器和类的适配器
上述的适配器就是对象适配器。再看看类适配器。
PS2ToUSB,只是简单模拟一下。因为java不允许多继承,所以java中没有类模式的代码,只有思想。
package com.bjpowernode.adapter;
/**
* 类适配器
* @author eason
*
*/
public class PS2ToUSB implements USBPort, PS2Port{
//重写workWithUSB,把工作交给workWithPS2
@Override
public void workWithUSB() {
workWithPS2();
}
}
差别就是:对象适配器实现了客户端想要的接口(USB),在内部有一个被适配对象(PS2)的引用,通过组合实现适配功能。类适配器实现了客户端想要的接口(USB)和被适配对象接口(PS2),通过继承来实现适配功能。
六.使用场景及使用感受
1.希望复用一些现存的类,但是接口又与复用环境要求不一致。
2.其实适配器模式有点无奈之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该考虑通过重构统一接口。
七.适配器模式与装饰者模式
它们都可以用来包装对象,本质区别在于
1.适配器模式:将一个接口转换成另外一个接口。
2.装饰者模式:不改变接口,只加入职责。


猜你喜欢
- trim中prefix与suffix等标签用法1.prefix 前缀增加的内容2.suffix 后缀增加的内容3.prefixOverrid
- Unity如何实现换装系统,供大家参考,具体内容如下1.创建Sprite Library Asset2.添加新目录Label 可以理解为标签
- Java实现驼峰、下划线互转1.使用 Guava 实现先引入相关依赖<dependency> <
- 一、思路将分页所需的内容都放到一个实体类中分页数据所需要的实体类!内包含页码,页大小,总条数,总页数,起始行pagehelpr提供了这个类
- 简单的实现了一个树的结构,很不完善!后续参考一些其他代码的实现。试图实现叶子存在可变的节点,能够用来解析xml文件。叶子的代码:packag
- spring boot 请求后缀匹配spring boot 项目中添加这个类可以实现url不同后缀区分了public class UrlMa
- 目录1、Android如何动态更换桌面图标1.1使用场景1.2知识点1.3使用Activity-alias2、巨坑2.1App的覆盖2.2桌
- 工厂方法模式简述与简单工厂模式基本相同,只是工厂是一个抽象的,需要有具体的工厂去实现它,然后利用这个工厂生产产品,之所以出现这个模式是因为,
- 本文实例讲述了C#实现的sqlserver操作类。分享给大家供大家参考,具体如下:using System;using System.Col
- 1.代码调试的重要性代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性。但是有一点必须强调:程序是设计出来的,而不是调试出来的。
- namespace ConsoleApplication2 { class Program { static v
- @ConfigurationProperties注入创建一个新的模板此过程就不在这介绍了,在我SpringBoot专栏里有详细过程。⭐⭐⭐注
- 本文实例为大家分享了Android实现简单画图画板的具体代码,供大家参考,具体内容如下效果如图:布局文件:<RelativeLayou
- 引言一个Java Gradle项目会涉及到资源的访问. 一般情况下会将当前项目所需的资源文件全部放置于resources文件夹下, 无论是m
- 在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的
- 由于maven 使用上手很容易所以很多时候可以囫囵吞枣能够使用就可以了,由于作者最近在做的持续集成的代码扫描的时候,发现私有云里面大型工程m
- Java流程控制用户交互Scannerjava.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入基本语
- 1 概述Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、转化解析和初始化,最终形成可以被虚拟机直接使用的Java
- 写完布局后 我们一般需要 findViewById找到这个控件,但是现在有一个很好用的插件ButterKnife 可以一键转化布局文件中的所
- 1.引言在操作应用的时候,会有很多不同的手势操作,如按下、单击、双击、长按等手势,我们可以在这些手势事件中添加相应的业务逻辑,那么如何检测不