今天给大家分享一下设计模式中的“适配器模式”。
基本介绍
适配器模式属于“结构型模式”的一种。该模式的核心思想就是将类中原本不适合当前客户端使用的接口转换成适用的接口,从而大大提高程序的兼容性。
并且从使用者的角度是看不到被适配的类地,也降低了代码之间的耦合性。
适配器模式的工作原理就是:用户调用适配器转换出来的接口,适配器再调用被适配类的相关接口,从而完成适配。
通过不同的实现方式,我们可以将其分成三类:类适配器模式,对象适配器模式,接口适配器模式。
讲解案例
小菜鸟基于linux系统开发了一个工具类,开发完成后领导说,客户还想在windows系统中使用。这时原来的功能肯定不再适用了,但是作为一个优秀的程序员我肯定是不会再开发一套了。这时我们小小的使用一下适配器模式,该问题就迎刃而解了。
类适配器模式
实现方式:
适配器类,通过继承“被适配的类”,并且实现“适配器接口”,从而完成适配。
代码:
基于linux系统开发的工具类 => 被适配的类
public class LinuxUtils {
public void linuxMethod() {
System.out.println("基于linux系统开发的方法!");
}
}
适配器接口
public interface IAdapter {
void adapterMethod();
}
转换成windows系统可用工具 => 具体适配器类
public class WindowsAdapter extends LinuxUtils implements IAdapter {
@Override
public void adapterMethod() {
super.linuxMethod();
System.out.println("转换成适用windows系统的工具!");
}
}
工具类的使用者
public class User {
public void useUtils(IAdapter iAdapter) {
iAdapter.adapterMethod();
}
}
测试类
public class Test {
public static void main(String[] args) {
User user = new User();
user.useUtils(new WindowsAdapter());
}
}
总结
缺点:java是单继承语言,类适配器模式又需要继承被适配的类,这就导致必须存在一个适配器接口。从这点就可以看出该模式是有一定局限性。并且因继承了被适配的类,所以类的所有方法都暴露在了适配器类中,从而增加了使用成本。
优点:由于继承了“被适配的类”,所以可以根据需求重写父类的方法,从而增加了代码的灵活性。
对象适配器模式
实现方式:
适配器类,持有“被适配的类”实例,实现“适配器接口”,完成适配。
代码实现
被适配的类、适配器接口、工具类的使用者类跟上面“类适配器模式”的示例代码相同,就不在此赘述了。
具体适配器类
public class WindowsAdapter implements IAdapter {
// 持有被适配的类实例
private LinuxUtils linuxUtils;
public WindowsAdapter(LinuxUtils linuxUtils) {
this.linuxUtils = linuxUtils;
}
@Override
public void adapterMethod() {
this.linuxUtils.linuxMethod();
System.out.println("转换成适用windows系统的工具!");
}
}
测试类
public class Test {
public static void main(String[] args) {
User user = new User();
user.useUtils(new WindowsAdapter(new LinuxUtils()));
}
}
总结
对象适配器模式根据合成复用原则,将原来继承“被适配的类”改为组合,不再要求必须存在适配器接口,解决了因为继承带来的局限性。降低了使用成本,增加了代码的灵活性。
接口适配器模式
简介
1、接口适配器模式中被适配的对象是一个接口。
2、在我们不需要全部实现被适配接口中提供的方法时,可以设计一个抽象类先实现该接口,并空实现接口中的所有方法。这样继承了该抽象类的子类就可以选择性的重写其中的方法,以达到想要的效果。
代码
被适配的接口:
public interface Interface {
void method1();
void method2();
void method3();
}
适配器抽象类(空实现被适配接口中的所有方法):
public abstract class AbsAdapter implements Interface {
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
客户端测试类:
public class Client {
public static void main(String[] args) {
// 重写被适配接口中method1方法
AbsAdapter absAdapter = new AbsAdapter() {
@Override
public void method1() {
System.out.println("使用被适配接口中method1方法!");
}
};
absAdapter.method1();
}
}
结尾
因为示例代码足够简单,所以执行结果就不再展示了。以上代码的主要目的只是为了讲解适配器模式。
今天的分享就到这里了,如果感觉“小菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。