Java常用设计模式-适配器模式

简介: Java常用设计模式-适配器模式

适配器模式是指把一个类的接口转换成另一个接口,使得原本不相兼容的类可以一起工作,属于结构型设计模式。可以说,适配器模式主要是解决功能兼容性问题

我们都知道:在日常生活中,我们的电源插座都是220V的交流电,因此给手机充电都需要一个电源适配器进行转换,这个手机的电源适配器(也就是充电器)就是一个起着转换作用的角色。

我们用代码来模拟一下这个场景。

1,创建220V交流电(原始功能)

创建220V交流电类如下:

packagefun.swsk33site.adapter.model;
/*** 220V交流电*/publicclassAC220V {
/*** 接入交流电并获取** @return 获取到220V交流电*/publicintoutput() {
return220;
   }
}

这个类就可以得到220V的电流了!但是这个无法直接使用,因此需要做转换。

2,创建适配器接口,并实现各个适配器(适配器,用于转换原始功能)

电源适配器并非只有一种,比如华为40W快充和苹果的充电器就不一样,因此我们要把适配器先抽象为一个接口,再去实现各个适配器:

packagefun.swsk33site.adapter.adapter;
/*** 电源适配器接口*/publicinterfacePowerAdapter {
/*** 对输入电源作转换** @return 转换后电流*/intdoConvert();
}

实现华为40W快充适配器:

packagefun.swsk33site.adapter.adapter.impl;
importfun.swsk33site.adapter.adapter.PowerAdapter;
importfun.swsk33site.adapter.model.AC220V;
/*** 华为40W快充适配器*/publicclassHuaweiFastChargeimplementsPowerAdapter {
privateAC220Vac220V;
/*** 构造器依赖注入(模拟华为充电器接入220V交流电)** @param ac220V 接入的交流电*/publicHuaweiFastCharge(AC220Vac220V) {
this.ac220V=ac220V;
   }
@OverridepublicintdoConvert() {
// 转换为10V电流intoutput=ac220V.output() /22;
returnoutput;
   }
}

实现苹果5W手机充电器:

packagefun.swsk33site.adapter.adapter.impl;
importfun.swsk33site.adapter.adapter.PowerAdapter;
importfun.swsk33site.adapter.model.AC220V;
/*** 苹果5V手机充电器*/publicclassAppleChargeimplementsPowerAdapter {
privateAC220Vac220V;
/*** 构造器依赖注入(模拟苹果充电器接入220V电源)** @param ac220V*/publicAppleCharge(AC220Vac220V) {
this.ac220V=ac220V;
   }
@OverridepublicintdoConvert() {
intoutput=ac220V.output() /44;
returnoutput;
   }
}

可见,不同的适配器都对原始的功能进行了转换,只不过转换的方式不一样。

3,使用适配器

我们在主方法中试一下子:

PowerAdapterhuaweiAdapter=newHuaweiFastCharge(newAC220V());
System.out.println("华为充电器,得到电压:"+huaweiAdapter.doConvert());
PowerAdapterappleAdapter=newAppleCharge(newAC220V());
System.out.println("苹果充电器,得到电压:"+appleAdapter.doConvert());

结果:

网络异常,图片无法展示
|

4,总结

可见适配器模式主要是做了一个转换和兼容的工作。适配器中输入的是原始功能(220V交流电),而输出的是转换后兼容的功能(10V或者5V直流电),至于转换的逻辑,当然就是放在适配器类中了!其实还是很简单的。

通常适用于以下场景:

  • 已经存在的类和需求不匹配
  • 软件系统升级之后,不同的功能导致了不兼容问题

事实上,我们很多网站都有登录功能,除了可以密码登录之外,还可以QQ或者微信登录。这么多登录方式是如何组织起来的呢?其实使用适配器模式+策略模式即可完成。这样登录形式丰富了,但是后台的处理逻辑几乎不用怎么变,符合开闭原则。

上述示例的类图如下:

网络异常,图片无法展示
|

示例仓库地址

相关文章
|
12天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
1天前
|
设计模式 算法 Java
设计模式在Java开发中的应用
设计模式在Java开发中的应用
10 0
|
7天前
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
19 4
|
7天前
|
设计模式 存储 前端开发
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
24 4
|
7天前
|
设计模式 缓存 监控
JAVA设计模式之结构型模式
结构模型:适配器模型、桥接模型、过滤器模型、组合模型、装饰器模型、外观模型、享受元模型和代理模型。
19 3
|
11天前
|
设计模式 算法 Java
Java基础教程(19)-设计模式简述
【4月更文挑战第19天】设计模式是软件设计中反复使用的代码设计经验,旨在提升代码的可重用性、可扩展性和可维护性。23种模式分为创建型、结构型和行为型三类。创建型模式如工厂方法、抽象工厂、建造者、原型和单例,关注对象创建与使用的分离。结构型模式涉及对象组合,如适配器、装饰器、外观等,增强结构灵活性。行为型模式专注于对象间职责分配和算法合作,包括责任链、命令、观察者等。设计模式提供标准化解决方案,促进代码交流和复用。
|
12天前
|
设计模式 Java
Java 设计模式:混合、装饰器与组合的编程实践
【4月更文挑战第27天】在面向对象编程中,混合(Mixins)、装饰器(Decorators)和组合(Composition)是三种强大的设计模式,用于增强和扩展类的功能。
20 1
|
12天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
32 2
|
12天前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
21 1
|
12天前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
20 1