设计模式-适配器模式-Java实现

tech2024-02-01  91

1、适配器模式

好多人讲适配器模式喜欢用电压举例,众所周知,我们用的电在远距离传输过程中,为了避免损耗过大,使用了高压电传输,但我们家里用的电只有220V,这中间用到了一个叫变压器的东西,它将高压电转换为了家用电; 再比如要用笔记本连接投影仪,但笔记本上只有HDMI接口,没有VGA接口,那么就需要用到HDMI转VGA转换器来帮助实现投影。


转换一词就是适配器模式的精髓所在 考虑这样一种场景,A公司为B公司提供一组接口,现在A公司对这组接口进行了升级,姑且称升级前的接口为1.0版本,升级后的接口为2.0版本,而B公司的程序都是使用1.0版本的接口来编写的,对2.0版本接口不兼容,那么就只有三种办法:

A公司重写接口来兼容【不现实】B公司使用2.0版本接口重写程序【不现实】A公司编写可以将2.0版本接口转换为1.0版本接口的适配器【完美!!!】

这就是适配器模式,搭建一座两个不兼容接口之间的桥梁,亦或者说将一个接口包装为另一个接口【ps:适配器模式也叫包装器模式】。 适配器模式有两种:

类适配器模式对象适配器模式

2、实例解析

将上面考虑的场景实例化,假设B公司有如下代码,使用A公司提供的Print类,对输入的Hello进行处理,printWeak函数输出字符串 (Hello),printStrong函数输出字符串 *Hello*:

public class Main { public static void main(String[] args) { Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong(); } }

而现在A公司对代码进行了优化,不再提供 Print 类了,相应的功能由 Banner 类来提供,Banner类的代码如下,可以看到 Banner 类中的 showWithParen 以及 showWithAster 两函数分别对应 Print 类中的 printWeak 和 printStrong 两函数:

public class Banner { private String string; public Banner(String string){ this.string = string; } public void showWithParen(){ System.out.println("(" + string + ")"); } public void showWithAster(){ System.out.println("*" + string + "*"); } }

那么B公司的代码就不能兼容A公司的2.0版本的接口了,因此A公司需要提供相应的适配器。

i、类适配器模式

类适配器模式通过继承的方式来实现代码兼容,如下定义Print接口:

public interface Print { void printWeak(); void printStrong(); }

而后新建适配器 PrintBanner 类继承 Banner 类,以及实现 Print接口,这个类的目的在于通过调用父类 Banner 类的函数来实现接口 Print 中所定义的函数,这样B公司就无需修改代码并且还能使用 Banner 类的函数啦。

public class PrintBanner extends Banner implements Print { public PrintBanner(String string){ super(string); } @Override public void printWeak() { showWithParen(); } @Override public void printStrong() { showWithAster(); } }

ii、对象适配器模式

对象适配器模式通过委托的方式来实现代码兼容,如下定义抽象类 Print:

public abstract class Print{ public abstract void printWeak(); public abstract void printStrong(); }

而后新建适配器 PrintBanner 类继承抽象类 Print,这里可以发现,适配器不再继承 Banner 类,而是在类中建了个 Banner 类的对象,直接操作对象来实现相关操作,这个就是所谓委托的意思:

public class PrintBanner extends Print{ private Banner banner; public PrintBanner(String string){ this.banner = new Banner(string); } public void printWeak(){ banner.showWithParen(); } public void printStrong(){ banner.showWithAster(); } }
最新回复(0)