设计模式-适配器模式
时间:2022-07-25
本文章向大家介绍设计模式-适配器模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
各国的电压大致分为110V和220V, 一部手机或一部电脑不能直接使用这么高的电压的,需要通过变压器才能直接使用。要不然一插就炸了...
适配器模式是什么?
适配器模式也叫变压器模式,属于结构型模式,用于两个不同的对象互相转换,将原本不能一起工作或各自单个的对象可以一起工作,该模式在实际开发过程中非常常用;
模式可以干什么?
适配器主要用于将两种不同的对象做兼容,起到一个转换的作用。让原本不相干的东西,或不匹配的可以兼容使用。比如电压方面的,美图是110V而中国是220V,原来美国的电器支持不了中国的,电压,一插就挂了。所以通过变压器,将不能兼容的电器用起来。
优点:
- 提升复用性,并且可以解藕,不影响原有功能,并且减化了实际流程,很好的起到一个解耦作用;
- 提升拓展性,原来要绕3公里才能到的现在100米就解决了,呵呵;还有一点就是原来的接口不用了,你只需要把这个拓展的功能干掉就可以了,不用去改很多代码,有利用后期维护。
缺点:
- 对不相干或完全不一样的对象,会导致转换的成本非常高,并且实现过程也异常复杂;
- 局限性比较高,只能适配专用,而且每兼容一种对象/物品都需要经过特殊处理;
类图
实现代码
/**
* @Auther: csh
* @Date: 2020/5/20 17:17
* @Description:抽象输出接口
*/
public interface IVoltage {
public int outPutVoltage();
}
/**
* @Auther: csh
* @Date: 2020/5/19 17:35
* @Description:11V电压
*/
public class Voltage110V implements IVoltage{
private final static int VOLTAGE = 110;
@Override
public int outPutVoltage() {
return VOLTAGE;
}
}
/**
* @Auther: csh
* @Date: 2020/5/19 17:35
* @Description:220V电压
*/
public class Voltage220V implements IVoltage{
private final static int VOLTAGE = 220;
@Override
public int outPutVoltage() {
return VOLTAGE;
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 16:59
* @Description:5V接口
*/
public interface IOutVoltage5V {
int outVoltage5V();
}
/**
* @Auther: csh
* @Date: 2020/5/20 16:59
* @Description:12V接口
*/
public interface IOutVoltage12V {
int outVoltage12V();
}
/**
* @Auther: csh
* @Date: 2020/5/20 17:06
* @Description:手机用5V电压
*/
public class Phone {
private int voltage5v=5;
void charging(IOutVoltage5V voltage5V){
//判断用何种充电
int i = voltage5V.outVoltage5V();
if(voltage5v == i){
System.out.println("手机充电中....");
}else{
System.out.println("电压不一致......");
}
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 17:10
* @Description:
*/
public class Computer {
private int voltage12v=12;
void charging(IOutVoltage12V voltage12V){
//判断用何种充电
int i = voltage12V.outVoltage12V();
if(voltage12v == i){
System.out.println("电脑正在充电中....");
}else{
System.out.println("电压不一致......");
}
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 17:01
* @Description:中国适配器
*/
public class ChinaAdapter extends Voltage220V implements IOutVoltage5V, IOutVoltage12V {
int voltage12V = super.outPutVoltage();
int voltage5V = super.outPutVoltage();
@Override
public int outVoltage12V() {
System.out.println("将中国的220V转成12V...");
voltage12V = 12;
return voltage12V;
}
@Override
public int outVoltage5V() {
System.out.println("将中国的220V转成5V...");
voltage5V = 5;
return voltage5V;
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 17:01
* @Description:中国适配器
*/
public class AmericaAdapter extends Voltage110V implements IOutVoltage5V, IOutVoltage12V {
int voltage12V = super.outPutVoltage();
int voltage5V = super.outPutVoltage();
@Override
public int outVoltage12V() {
System.out.println("将美国的110V转成12V...");
voltage12V = 12;
return voltage12V;
}
@Override
public int outVoltage5V() {
System.out.println("将美国的110V转成5V...");
voltage5V = 5;
return voltage5V;
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 15:08
* @Description:适配器
*/
public class Client {
public static void main(String[] args) {
//中国转换器
//手机充电
Phone phone = new Phone();
ChinaAdapter chinaAdapter = new ChinaAdapter();
phone.charging(chinaAdapter);
//电脑充电
Computer computer = new Computer();
computer.charging(chinaAdapter);
//美国转换器
//手机充电
Phone phone2 = new Phone();
ChinaAdapter chinaAdapter2 = new ChinaAdapter();
phone2.charging(chinaAdapter2);
//电脑充电
Computer computer2 = new Computer();
computer2.charging(chinaAdapter2);
//可以自己再拓展一个整合各个国家的转换器...
}
}
结果
将中国的220V转成5V...
手机充电中....
将中国的220V转成12V...
电脑正在充电中....
将中国的220V转成5V...
手机充电中....
将中国的220V转成12V...
电脑正在充电中....
最后
其实在各大开源产品中,类似适配器模式是被广泛应用,学习一个模式简单,但是应用好一个模式真的不容易,需要在日常开发过程中广泛应用于实际项目单看没啥用,呵呵!
spring用到适配器如下:
HandlerAdapter
MethodBeforeAdvice
AfterReturningAdvice
ThrowsAdvice
MethodBeforeAdviceInterceptor
AfterReturningAdviceInterceptor
ThrowsAdviceInterceptor
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言中的马尔科夫机制转换(Markov regime switching)模型
- R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
- nginx快速入门
- R语言中进行期权定价的Heston模型
- 使用R语言随机波动模型SV处理时间序列中的随机波动率
- 20个ES6面试高频问题
- i++和++i傻傻分不清楚?这里给你最清楚的解答
- android APT 使用
- Flutter异步编程async与await的基本使用
- 教大家一个万能PPT图片排版技巧,太赞了!
- 重复读取 HttpServletRequest 中 InputStream 的方法
- 测试面试题集锦(三)| 计算机网络和数据库篇(附答案)
- 关于Scikit-Learn你(也许)不知道的10件事
- 技术天地 | CSS-in-JS:一个充满争议的技术方案
- 安全研究 | 通过域名劫持实现Azure DevOps账户劫持