掌握设计模式--适配器模式
适配器模式(Adapter Pattern)适配器模式是一种结构型设计模式,用于将一种接口转换为客户端期望的另一个接口,使得原本因接口不兼容而无法一起工作的类可以协同工作。适配器为中间者,连接着两个互不相容的接口,从而实现接口的适配。
核心思想:在不改变现有代码的情况下,将一个类的接口转换为客户端期望的接口。
主要组成部分
适配器模式包含以下主要角色:
[*]目标接口(Target):定义客户端使用的接口;
[*]需要适配的类(Adaptee):一个现有的接口或类,其接口与目标接口不兼容;
[*]适配器(Adapter):一个中间层,连接目标接口和需要适配的类,实现接口的转换;
[*]客户端(Client):通过目标接口使用适配器的功能。
一句话概括适配器组成之间的关系:
一般情况下,适配器是目标接口的具体实现类,实现的具体功能是通过调用需要适配的类的功能来完成。
适配器模式的两种实现方式
类适配器(基于继承)
通过继承需要适配的类,并实现目标接口。(多用于单继承语言,例如Java)
对象适配器(基于组合)
通过组合一个需要适配的类的实例,并实现目标接口。(推荐使用,灵活性更高)
案例实现
场景为:插头适配器
假设你有一个旧接口为两孔插头,现在需要适配为新的电源插头接口(三孔插头)。
目标接口--适配器--需要适配的类,这三者的关系为客户端要使用适配类(三孔插头),但是无法直接插入两孔插头的插座,需要先插入适配器,然后再将适配器插入两孔插头,所以他们的连接关系为:需要适配的类>>>适配器>>>目标接口。
案例类图
类适配的类图(基于继承)
对象适配的类图(基于组合)
目标接口(Target)
两孔插头
public interface TwoPinPlug {
void connect();
}被适配类(Adaptee)
三孔插头--接口
public interface ThreePinPlug {
void connectWithThreePins();
}三孔插头--具体实现类
public class ThreePinPlugImpl implements ThreePinPlug {
public void connectWithThreePins() {
System.out.println("连接三孔插头");
}
}类适配器(Adapter - 继承)
通过继承来实现的适配器
public class PlugAdapter extends ThreePinPlug implements TwoPinPlug {
@Override
public void connect() {
super.connectWithThreePins(); // 转换三孔插头的接口为两孔插头接口
}
}对象适配器(Adapter - 组合)
通过组合的方式来实现的适配器
public class PlugAdapter2 implements TwoPinPlug {
private ThreePinPlug threePinPlug;
public PlugAdapter2(ThreePinPlug threePinPlug) {
this.threePinPlug = threePinPlug;
}
@Override
public void connect() {
threePinPlug.connectWithThreePins(); // 转换三孔插头的接口为两孔插头接口
}
}客户端代码
public class AdapterPatternDemo {
public static void main(String[] args) {
// 使用类适配器
TwoPinPlug adapter1 = new PlugAdapter();
adapter1.connect();
// 使用对象适配器
ThreePinPlug threePinPlug = new ThreePinPlugImpl();
TwoPinPlug adapter2 = new PlugAdapter2(threePinPlug);
adapter2.connect();
}
}执行结果
连接三孔插头
连接三孔插头
总结
适配器模式通过引入中间层(适配器),将不兼容的接口转换为客户端需要的接口,实现系统的兼容性和灵活性。
适用场景:当现有类的接口与需求接口不兼容时;当需要将多个不同接口的类统一为同一个接口时;当不修改已有代码且需要与新需求兼容时。
什么是设计模式?
设计模式--原型模式及其编程思想
掌握设计模式--单例模式及其思想
掌握设计模式--生成器模式
掌握设计模式--简单工厂模式
掌握设计模式--工厂方法模式
掌握设计模式--抽象工厂模式
掌握设计模式--装饰模式
掌握设计模式--组合模式
超实用的SpringAOP实战之日志记录
2023年下半年软考考试重磅消息
通过软考后却领取不到实体证书?
计算机算法设计与分析(第5版)
Java全栈学习路线、学习资源和面试题一条龙
软考证书=职称证书?
软考中级--软件设计师毫无保留的备考分享
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]