

从这篇文章开始来盘一盘结构型设计模式,在开始之前先来简单回顾一下创建型的设计模式有哪些,如果有兴趣,就来一起学习吧:
那么结构型的设计模式有哪些呢?结构型模式是用于处理类或对象的组合的设计模式,共七种,包括适配器模式、装饰者模式、代理模式、门面模式、桥梁模式、组合模式、享元模式。这篇文章的主角就是适配器模式。
适配器模式(Adapter Pattern)允许将一个类的接口适配成用户所期待的接口,从而使原本因接口不兼容而不能在一起工作的类能够一起工作。
适配器模式分为两种类型:对象适配器模式和类适配器模式。
适配器模式的核心是将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作。适配器模式是一种结构型设计模式,它通过引入一个适配器类来将不兼容的接口转换为兼容的接口。
适配器模式中有三个关键角色,分别是目标角色(Target)、源角色(Adaptee)和适配器角色(Adapter)。
适配器模式的核心是将两个没有关系的类组合在一起使用,只要传递了某个类的对象,就可以在适配器中调用这个类的方法。在实现适配器模式时,通常需要编写一个适配器类来实现目标接口,并将源接口转换为目标接口的实现方法。同时,还需要在客户端中使用目标接口来调用适配器的实例,从而间接地调用源接口的方法。
1、类的适配器模式:通过继承源接口类来实现适配,需要修改源接口类的继承结构。

例如,将一个接口适配成另一个接口:
- interface Target {
- void request();
- }
-
- class Adaptee {
- void specificRequest() {
- System.out.println("Adaptee's specific request.");
- }
- }
-
- class Adapter extends Adaptee implements Target {
- public void request() {
- specificRequest();
- }
- }
在这个例子中,适配器Adapter继承了Adaptee类,实现了Target接口。适配器将Adaptee的特定请求(specificRequest)适配成Target接口的request方法。客户端通过Target接口来调用适配器,从而间接地调用Adaptee的特定请求。
2、对象适配器模式:通过将源对象封装在适配器对象中来实现适配,不需要修改源接口类的继承结构。

例如,将一个类的对象适配成另一个类的对象:
- interface Target {
- void request();
- }
-
- class Adaptee {
- void specificRequest() {
- System.out.println("Adaptee's specific request.");
- }
- }
-
- class Adapter implements Target {
- private Adaptee adaptee;
- public Adapter(Adaptee adaptee) {
- this.adaptee = adaptee;
- }
- public void request() {
- adaptee.specificRequest();
- }
- }
在这个例子中,适配器Adapter实现了Target接口。适配器将Adaptee的对象封装在适配器对象中,适配器的request方法通过调用Adaptee的特定请求(specificRequest)来实现适配。客户端通过Target接口来调用适配器,从而间接地调用Adaptee的特定请求。
适配器模式要解决什么问题?
在计算机编程中,适配器模式可以用于解决接口不兼容的问题,它通过将一个类的接口包裹在一个已存在的类中,从而将该类的接口转换成客户所期待的接口。适配器的宗旨是保留现有类所提供的服务,向客户提供接口,以满足客户的期望。
在生活当中,适配器的例子比比皆是,如在中国,生活用电的标准是220V的交流电,但是平常使用的手机的标准电压是5V的直流电,充电线末端的充电头实际上就是一个适配器,主要功能就是把220V的交流电转换成了手机需要的5V直流电。
- /**
- * 5v直流电抽象接口类
- */
- public interface DC5 {
- Integer outputDC5v();
- }
- /**
- * 220v交流电实体类
- */
- public class AC220 {
- public Integer outputAc220v() {
- Integer output = 220;
- System.out.println("输出交流电:" + output + "V");
- return output;
- }
- }
类适配器

- /**
- * 220v转5v适配器类
- */
- public class PowerAdapter extends AC220 implements DC5{
- @Override
- public Integer outputDC5v() {
- Integer outputAc220v = this.outputAc220v();
- System.out.println("适配器开始工作");
- int output5v = outputAc220v / 44;
- System.out.println("适配器输出电压:"+output5v+"5");
- return output5v;
- }
- }
对象适配器

- /**
- * 220v转5v适配器类
- */
- public class PowerAdapter2 implements DC5{
- private AC220 ac220;
-
- public PowerAdapter2(AC220 ac220) {
- this.ac220 = ac220;
- }
-
- @Override
- public Integer outputDC5v() {
- Integer outputAc220v = ac220.outputAc220v();
- System.out.println("适配器开始工作");
- int output5v = outputAc220v / 44;
- System.out.println("适配器输出电压:"+output5v+"5");
- return output5v;
- }
- }
- /**
- * 适配器模式
- */
- public class Test {
- public static void main(String[] args) {
- //类适配器
- System.out.println("类适配器:--->");
- DC5 dc5=new PowerAdapter();
- dc5.outputDC5v();
- //对象适配器
- System.out.println("对象适配器:--->");
- AC220 ac220 = new AC220();
- DC5 dc52=new PowerAdapter2(ac220);
- dc52.outputDC5v();
- }
- }

如果你在业务的开发过程中,遇到以下这些场景,就可以选择使用适配器模式,来使你的代码实现更优雅和高效:
适配器模式在Spring框架中有多处应用:
优点:
缺点:
