定义
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
适用环境
-系统需要使用现有的类,而这些类的接口不符合系统的需要。
-想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作
模式结构
-Target:目标抽象类
-Adapter:适配器类
-Adaptee:适配者类
-Client:客户类
UML
![](https://img.haomeiwen.com/i11245777/a32e730fc4b434fd.jpg)
实例讲解
情景
背景:小成买了一个进口的电视机
冲突:进口电视机要求电压(110V)与国内插头标准输出电压(220V)不兼容
解决方案:设置一个适配器将插头输出的220V转变成110V
使用步骤
1.创建Target接口(期待得到的插头):能输出110V(将220V转换成110V)
public interface Target {
//将220V转换输出110V(原有插头(Adaptee)没有的)
public void Convert_110v();
}
2.创建源类(原有的插头) ;
public class PowerPort220V {
//原有插头只能输出220V
public void Output_220v(){
}
}
- 创建适配器类(Adapter)
public class Adapter220V extends PowerPort220V implements Target{
@Override
public void Convert_110v() {
this.Output_220v();
}
}
4.定义具体使用目标类,并通过Adapter类调用所需要的方法从而实现目标(不需要通过原有插头)
Target mAdapter220V = new Adapter220V();
ImportedMachine mImportedMachine = new ImportedMachine();
//用户拿着进口机器插上适配器(调用Convert_110v()方法)
//再将适配器插上原有插头(Convert_110v()方法内部调用Output_220v()方法
输出220V)
//适配器只是个外壳,对外提供110V,但本质还是220V进行供电
mAdapter220V.Convert_110v();
mImportedMachine.Work();
优点
-更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
-透明、简单
客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单 & 更直接
-更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
-解耦性
将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码
-符合开放-关闭原则
同一个适配器可以把适配者类和它的子类都适配到目标接口;可以为不同的目标接口实现不同的适配器,而不需要修改待适配类
缺点
过多的使用适配器,会让系统非常零乱,不易整体进行把握
参考:
https://blog.csdn.net/carson_ho/article/details/54910430
网友评论