6.适配器模式(结构型)-灵析社区

菜鸟码转

六、 适配器模式(结构型)

适配器设计模式是一种结构型设计模式,通过封装一个已有对象的接口,创建一个新的对象,以便与其他对象协同工作。

适配器模式通常用于以情况:

  • 将一个已经存在的类或接口与另一个系统需要的类或接口进行适配。例如,当我们使用一些第三方库时,可能需要将其提供的接口适配成我们自己的接口,以便于我们的代码能够正常运行;
  • 对现有的类进行功能扩展,使其能够满足不同的需求。例如,在不改变原有业务逻辑的前提下,我们可以通过定义适配器来增加一些新的方法或者属性;
  • 在多个类之间进行适配。例如,当我们需要将多个不兼容的类进行整合时,可以使用适配器来实现它们之间的互操作性。

适配器模式的实现方式

适配器模式的实现方式有:类适配器、对象适配器和接口适配器。

类适配器

类适配器通过继承目标类并实现源类来实现适配器。适配器类既是目标类的子类又实现了源类的接口,从而实现了目标类与源类之间的适配。类适配器需要访问源类的一些受保护成员,因此可能会破坏封装性。

// 目标接口
interface Target {
  
    void request();
  
}

// 源类,需要被适配
class Adaptee {
  
    public void specificRequest() {
        System.out.println("Adaptee specific request");
    }
  
}

// 适配器类,继承目标类并实现源类
class Adapter extends Adaptee implements Target {
    
    @Override
    public void request() {
        // 调用源类方法
        super.specificRequest(); 
    }
  
}

// 客户端代码
public class Client {
  
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
  
}

对象适配器

对象适配器通过包装一个已有的类的接口,把新的数据类型引入到系统中。具体来说,对象适配器将源类和目标类的接口通过一个适配器对象进行适配,使得源类和目标类之间可以协同工作,而不需要任何修改原来的类。

在对象适配器中,适配器对象通常通过实现目标接口,同时包装一个源类对象来完成适配。由于对象适配器不需要修改源类的代码,因此可以灵活地重用已有的类,同时也不会破坏原有的类关系。这种方式更符合开闭原则,可以方便地扩展和修改接口,提供更好的灵活性。

// 目标接口
interface Target {
    void request();
}

// 源类,需要被适配
class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee specific request");
    }
}

// 适配器类,持有源类的引用,并实现目标接口
class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest(); // 调用源类方法
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.request();
    }
}

接口适配器

接口适配器模式使用一个抽象类或接口,其中定义了若干个默认的空实现。当子类继承该抽象类或实现该接口时,只需要重写需要的方法,从而避免了实现所有方法的麻烦。接口适配器主要用于拆分一个复杂的接口,提供默认的实现,让客户端选择自己所需的接口方法。

// 抽象接口
interface Target {
  
    void request();
  
    void anotherRequest();
  
}

// 默认实现类,提供所有方法的默认空实现
abstract class DefaultAdapter implements Target {
  
    @Override
    public void request() {}

    @Override
    public void anotherRequest() {}
  
}

// 子类1,只需要实现一个方法
class Adapter1 extends DefaultAdapter {
  
    @Override
    public void request() {
        System.out.println("Adapter1 request");
    }
  
}

// 子类2,只需要实现另一个方法
class Adapter2 extends DefaultAdapter {
  
    @Override
    public void anotherRequest() {
        System.out.println("Adapter2 another request");
    }
  
}

// 客户端代码
public class Client {
  
    public static void main(String[] args) {
        // 只需要使用需要的方法
        Target target1 = new Adapter1();
        target1.request();

        Target target2 = new Adapter2();
        target2.anotherRequest();
    }
  
}

总结

类适配器、对象适配器和接口适配器都是将一个不兼容的接口转化成另一个兼容的接口的方式。它们之间的区别在于实现机制和适用场景。类适配器需要继承目标类,而对象适配器则通过组合的方式,将适配器包装在一个对象中。接口适配器则是针对接口的具体实现方式,它可以使得客户端只依赖于需要使用的接口方法,避免了不必要的麻烦。

阅读量:2013

点赞量:0

收藏量:0