Java设计模式的学习之适配器模式

适配器模式


适配器模式(Adapter Pattern)是一种结构型设计模式,其主要目的是将一个类的接口转换成客户端期望的另一个接口,使得原本因接口不兼容而不能一起工作的类可以一起工作。适配器模式通常用于实现类之间的兼容,让它们可以无缝地协同工作。

适配器模式的主要角色包括:

  1. Target(目标接口):定义了客户端所期望的接口。
  2. Adaptee(被适配者):定义了被适配者已有的接口,这个接口需要被适配以符合目标接口。
  3. Adapter(适配器):对Adaptee的接口进行适配,以符合Target接口。适配器类是适配器模式的核心,它实现了目标接口,并且包含了一个Adaptee的实例。

适配器模式的两种主要形式:

  1. 类适配器模式:通过多重继承将适配器和被适配者结合起来。在Java中,由于不支持多重继承,通常使用组合的方式来实现类适配器模式。
  2. 对象适配器模式:通过组合的方式,将Adaptee的实例作为Adapter的一个成员变量,从而实现适配。

应用场景:

  1. 系统需要使用一些现有的类,而这些类的接口不符合系统的需要:在这种情况下,可以创建一个适配器类,将这些类的接口转换成系统需要的接口。
  2. 想要建立一个可重复使用的类,用来与一些彼此之间没有太大关系的类一起工作,包括一些可能在将来引进的类:适配器模式可以提供统一的接口,使得这些类可以被统一处理。
  3. 在这种情况下,不希望修改现有的类:适配器模式可以在不修改现有类的情况下,通过引入一个中间层来实现接口的转换。
  4. 需要统一多个类的接口,特别是当控制源代码,或者重构系统时:适配器模式可以帮助统一不同类的接口,使得它们可以被统一处理。

优点:

  • 提高类的复用性:适配器模式可以让那些接口不兼容的类可以一起工作,从而提高了类的复用性。
  • 提高系统的灵活性:通过引入一个中间层来实现接口的转换,使得系统更加灵活。
  • 解耦:适配器模式将目标接口和适配者接口解耦,增加代码的可维护性。

缺点:

  • 增加系统的复杂性:引入适配器类可能会增加系统的复杂性,特别是当存在多个适配器类时。
复制代码
// 旧的类
class OldClass {
    // 旧的方法
    public void oldMethod() {
        System.out.println("Old method called.");
    }
}

// 客户端代码
public class SimpleAdapterDemo {
    public static void main(String[] args) {
        // 创建旧的类实例
        OldClass oldClass = new OldClass();

        // 直接使用旧的类调用方法
        oldClass.oldMethod();
    }
}

改为适配器模式后:

复制代码
// 新的接口  
interface NewInterface {  
    void newMethod();  
}  
  
// 旧的类  
class OldClass {  
    // 旧的方法  
    public void oldMethod() {  
        System.out.println("Old method called.");  
    }  
}  
  
// 适配器类,将OldClass适配为NewInterface  
class Adapter implements NewInterface {  
    private OldClass oldClass;  
  
    public Adapter(OldClass oldClass) {  
        this.oldClass = oldClass;  
    }  
  
    @Override  
    public void newMethod() {  
        // 适配:调用OldClass的旧方法  
        oldClass.oldMethod();  
    }  
}  
  
// 客户端代码  
public class SimpleAdapterDemo {  
    public static void main(String[] args) {  
        // 创建旧的类实例  
        OldClass oldClass = new OldClass();  
  
        // 创建适配器,将旧的类适配为新的接口  
        NewInterface newInterface = new Adapter(oldClass);  
  
        // 使用新的接口调用方法  
        newInterface.newMethod();  
    }  
}
posted @   BingBing爱化学-04044  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示