设计模式 - 适配器模式
适配器模式
1.简介适配器模式是一种结构性设计模式,它能使接口不兼容的对象进行相互合作。定义:
适配器是一个特殊的对象,它能够转换对象接口,使其可以与其他对象进行交互。适配器通过封装对象,将复杂的转换过程隐藏于幕后,被封装的对象甚至察觉不到适配器的存在。不仅可以转换不同格式的数据,更有助于不同对象之间的合作。
运作方式:
1.适配器实现与其中一个现有对象兼容的接口 2.现有对象可以使用该接口安全的调用适配器方法。3.适配器方法被调用后将以另一个对象兼容的格式和顺序将请求传递给该对象。
2.UML 图
3.代码实现 eg:如一个手机充电器需要 5V 的充电器进行充电,但是家用电为 220v 不符合手机的充电标准,所以需要一个适配来进行转换,将 220v 转换为 5v 进行使用。首先构建一个手机类:java 复制代码 package com.gs.designmodel.adaptermodel;
import lombok.extern.slf4j.Slf4j;
/**
@author: Gaos
@Date: 2023-01-11 16:29
首先使用一部手机**/@Slf4jpublic class Mobile {
/**
充电
@param power 需要一个 5v 的充电器*/public void inputPower(V5Power power) {int provideV5Power = power.provideV5Power();log.info("手机(客户端):我需要一个 5v 电压充电,现在是——————》{}", provideV5Power);}}
手机充电需要一个提供 5v 电压的接口:java 复制代码 package com.gs.designmodel.adaptermodel;
/**
@author: Gaos
@Date: 2023-01-11 16:33/public interface V5Power {/
提供 5v 电压的充电器接口
@return*/int provideV5Power();}
但我们拥有的其实是一个 220v 的家用电:java 复制代码 package com.gs.designmodel.adaptermodel;
import lombok.extern.slf4j.Slf4j;
/**
@author: Gaos
@Date: 2023-01-11 16:37
现在拥有的其实是 220v 的家用电/@Slf4jpublic class V220Power {/**/public int provide220Power() {log.info("我提供 220v 家用电");return 220;}}
这时我们就需要一个适配器来起到 220v 转到 5v 的作用:java 复制代码 package com.gs.designmodel.adaptermodel;
import lombok.extern.slf4j.Slf4j;
/**
@author: Gaos
@Date: 2023-01-11 16:42
需要一个适配器完成 220v->5v 的作用**/@Slf4jpublic class V5PowerAdapter implements V5Power{
/**
使用组合的方式*/private V220Power v220Power;
/**
提供构造方法
@param v220Power*/public V5PowerAdapter(V220Power v220Power) {this.v220Power = v220Power;}
@Overridepublic int provideV5Power() {int i = v220Power.provide220Power();// 经过一系列的转换操作 log.info("适配器:经过一系列的转换操作 我将{}V 电压转换为了 5V", i);return 5;}}
最后,我们进行测试,也就是给手机充电:java 复制代码 public static void main(String[] args) {// 测试 Mobile mobile = new Mobile();V5PowerAdapter v5PowerAdapter = new V5PowerAdapter(new V220Power());mobile.inputPower(v5PowerAdapter);}
输出:java 复制代码 16:47:25.747 [main] INFO com.gs.designmodel.adaptermodel.V220Power - 我提供 220v 家用电 16:47:25.748 [main] INFO com.gs.designmodel.adaptermodel.V5PowerAdapter - 适配器:经过一系列的转换操作 我将 220V 电压转换为了 5V16:47:25.749 [main] INFO com.gs.designmodel.adaptermodel.Mobile - 手机(客户端):我需要一个 5v 电压充电,现在是——————》5
4.总结从上面的例子我们可以看出,我们使用了一个手机适配器将 220v 转换为了 5v 供手机使用,并且原有的手机及电压类都不需要进行修改。但其实这种模式会增加代码的复杂性,降低代码的可读性。比如我们看到它调用了 A 接口,但它其实在内部被适配为了 B 接口的实现,这其实并不是好的现象。适配器不仅是单向的也可以被扩展为双向的适配器,既可以把目标接口转为适配器接口,也可以把适配器接口转换为目标接口。通常适用于当你希望使用某个类,但是其接口与其他代码并不兼容时,或者来自第三方,本身无法修改的时候,可以使用适配器类。或者你需要复用这样的一些类,他们处于同一个继承体系,并且他们又有了一些额外的共同的方法,但这些共同方法并不属于同一继承体系下的方法。
评论