深圳专业网站建设公司哪家好,erp系统定制,国家企业公示网入口官网登录,免费微网站建站系统源码前言
在软件设计中#xff0c;适配器模式#xff08;Adapter Pattern#xff09;是一种结构型设计模式#xff0c;旨在使不兼容的接口能够协同工作。它通过引入一个适配器类#xff0c;帮助两个接口之间进行适配#xff0c;使得它们能够互相操作。本文将详细介绍适配器模…前言
在软件设计中适配器模式Adapter Pattern是一种结构型设计模式旨在使不兼容的接口能够协同工作。它通过引入一个适配器类帮助两个接口之间进行适配使得它们能够互相操作。本文将详细介绍适配器模式的定义、使用场景、实现方式、接口适配器以及其优缺点。
一、适配器模式的定义
适配器模式通过引入一个适配器类将一个类的接口转换成客户端所期望的另一种接口。适配器模式的核心在于“适配”它允许原本由于接口不兼容而无法一起工作的类能够协同工作。
主要角色
目标接口Target目标接口是客户端所期望的接口定义了客户端需要的方法。客户端代码依赖于目标接口而不是具体的实现类这样可以使系统更加灵活和可扩展。适配者类Adaptee源接口是现有的接口它的接口与目标接口不一致。源接口包含了客户端需要的实际功能但其接口形式无法直接被客户端使用。适配器类Adapter适配器实现目标接口并持有源接口的实例对象适配器或继承源接口类适配器。适配器通过在实现目标接口的方法中调用源接口的方法将源接口的方法转换成目标接口的方法。
三者之间的关系
客户端依赖目标接口进行编程。适配器实现了目标接口并通过组合或继承的方式调用源接口的方法。适配器将源接口的方法适配成目标接口的方法从而使得客户端可以无缝地使用源接口的功能。
二、适配器模式的使用场景
适配器模式适用于以下情况
系统需要使用现有的类但接口不符合要求如果你有一个类它的接口与系统的需求不匹配可以通过适配器模式进行转换。需要使用多个现有的类但接口不一致如果系统中需要整合多个不兼容的接口可以通过适配器模式使其兼容。系统中使用第三方库或框架当你引入第三方库或框架时可能会遇到接口不一致的情况适配器模式可以帮助解决这些问题。
三、适配器模式的实现方式
适配器模式有三种主要的实现方式类适配器对象适配器和接口适配器 本文讲解的是类适配器 类适配器
特点 使用继承类适配器通过继承源类来实现适配功能。 单一适配由于 Java 中不支持多重继承类适配器只能适配一个源类。
优缺点
优点
简单实现 由于类适配器通过继承实现它可以直接访问被适配类Adaptee的所有方法。这使得实现适配器时相对简单不需要额外的委托逻辑。 提高代码的可复用性 适配器模式通过继承实现使得子类能够继承父类的所有功能从而提高了代码的复用性。 可以重定义被适配类的一些行为 通过继承可以在适配器类中重定义被适配类的一些方法实现更加灵活的适配。
缺点
受限于单继承 类适配器模式在Java等单继承语言中有一个显著的缺点即一个类只能继承一个父类。这意味着如果适配器类已经有一个父类就不能再使用类适配器模式来继承另一个类。 高耦合 适配器类和被适配类之间的耦合度较高因为适配器类直接继承了被适配类的实现。如果被适配类发生变化适配器类可能也需要进行相应的修改。 不符合“组合优于继承”原则 面向对象设计中组合优于继承的原则提倡使用组合来代替继承以降低类之间的耦合度。类适配器模式违背了这一原则因为它是通过继承来实现适配的。
【例】读卡器
现有一台电脑只能读取SD卡而要读取TE卡中的内容的话就需要使用到适配器模式。创建一个读卡器将IE卡中的内容读取出来。
类图如下 其中 为适配者类
定义了一个接口 TFCard 接口有两个方法读取数据写数据。子实现类TFCardImpl重写了接口的两个方法 这一部分为目标接口主要是SDCard包含两个方法读数据写数据子实现类为SDcardImpl Computer只能使用SD卡所以方法名为readSD()需要SDcard类型的对象返回字符串
当我们想用Computer去读取TF卡中的内容不能直接读取需要定义适配器类 我们要让这个适配器类实现目标接口就要重写SDCard中的两个方法同时我们要让它去继承TFCardImpl
实现之后这两个方法看似是从SD卡中读数据写数据但是实际上用的是TF卡中的功能
代码实现
//客户端
public class Client {public static void main(String[] args) {//创建计算机对象Computer computer new Computer();//读取SD卡中的数据String msg computer.readSD(new SDCardImpl());System.out.println(msg);System.out.println();//使用该电脑读取TF卡中的数据//定义适配器类String msg1 computer.readSD(new SDAdapterTF());System.out.println(msg1);}
}//计算机类
public class Computer {//从SD卡中读取数据public String readSD(SDCard sdCard) {if (sdCard null) {throw new NullPointerException(sd card is null);}return sdCard.readSD();}
}//适配器类
public class SDAdapterTF extends TFCardImpl implements SDCard {Overridepublic String readSD() {System.out.println(adapter read tf card);return readTF();}Overridepublic void writeSD(String msg) {System.out.println(adapter wrete tf card);writeTF(msg);}
}public interface SDCard {//从SD卡中读取数据String readSD();//往SD卡中写数据void writeSD(String msg);
}//具体的SD卡
public class SDCardImpl implements SDCard{Overridepublic String readSD() {String msg SDCard read msg : SD;return msg;}Overridepublic void writeSD(String msg) {System.out.println(SDCard write msg : msg);}
}//适配者类的接口
public interface TFCard {//从TF卡中读取数据String readTF();//往TF卡中写数据void writeTF(String msg);}//适配者类
public class TFCardImpl implements TFCard{Overridepublic String readTF() {String msg TFCard read msg : TF;return msg;}Overridepublic void writeTF(String msg) {System.out.println(TFCard write msg : msg);}
}四、总结
适配器模式是一种强大的设计模式能够有效解决接口不兼容的问题使得不同接口的类能够协同工作。通过合理使用适配器模式可以提高系统的灵活性和复用性但也需要注意其可能带来的复杂性和性能影响。
希望本文对你理解适配器模式有所帮助。如果你有任何问题或建议欢迎在评论区留言 参考资料12.设计模式-结构型模式-类适配器模式案例实现_哔哩哔哩_bilibili 已经到底啦