Java设计模式(十六)—— 适配器模式

Posted 小小印z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式(十六)—— 适配器模式相关的知识,希望对你有一定的参考价值。

        适配器模式定义如下:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。可以想象成转接器。适配器模式的宗旨就是,基于现有类所提供的服务,向客户端提供接口,以满足客户的期望。适配器主要分为两类:对象适配器、类适配器。

适合适配器模式的情景如下:

  • 一个程序想使用已存在的类,但该类实现接口与当前程序所使用接口不一致。

 一、对象适配器

对象适配器各个角色描述:

  • IHopeInterface:定义了客户希望调用的方法形式
  • ThirdCompany:实现功能的第三方软件类
  • Adapter:适配器类,内部包含第三方软件的成员变量,重写IHopeInterface接口定义的方法,在内部直接调用第三方软件的方法实现我们所需的功能
  • Client:客户端,调用自己需要的领域接口IHopeInterface,实现相关功能

例如:要开发一个加法的功能,定义了最初的接口,如下:

public interface IMath 
    int add(int a ,int b);

当要进行具体开发的时候,突然发现了一个第三方的软件,它已经实现了我们所需的加法功能,具体代码如下所示:

public class ThirdCompany 
    public int addCalc(int a, int b) 
        return a + b;
    

因此我们想:能否在开发中既能用上第三方软件,又能用上所定义的IMath接口呢,如下:

public class MyMath implements IMath
    ThirdCompany thirdCompany;
    @Override
    public int add(int a, int b) 
        return thirdCompany.addCalc(a, b);
    
    public MyMath(ThirdCompany thirdCompany) 
        this.thirdCompany = thirdCompany;
    

将第三方软件对象定义为成员变量,add() 方法内直接调用第三方软件的方法进行加法运算。可以看出:add() 方法仅是起到了一个转换器的作用,具体功能是由第三方软件完成的。

本类就是对象适配器类,对象是指第三方软件对象成员变量 thirdCompany ,那么适配谁呢?适配我们所定义的接口IMath。我们希望用我们定义IMath接口中add() 方法形式完成所需的加法运算,这是编制MyMath类的基本条件。

一个简单的测试类:

public class Test 
    public static void main(String[] args) 
        ThirdCompany thirdCompany = new ThirdCompany();
        IMath obj = new MyMath(thirdCompany);
        System.out.println(obj.add(3, 5));
    

二、类适配器

类适配器各个角色描述:

  • IHopeInterface:定义了客户希望调用的方法形式
  • ThirdCompany:实现功能的第三方软件类
  • Adapter:适配器类,继承第三方软件,实现IHopeInterface接口,重写接口定义的方法,在方法中直接调用第三方软件的方法实现所需功能
  • Client:客户端,调用自己需要的领域接口IHopeInterface,实现相应功能。

利用类适配器实现所需功能,MyMath2代码如下:

public class MyMath2 extends ThirdCompany implements IMath

    @Override
    public int add(int a, int b) 
        return addCalc(a, b);
    

可以看出类适配器和对象适配器的主要区别:对象适配器是在适配器类中包含第三方软件类对象,类适配器中适配器类是从第三方软件类派生而来,是继承关系。

三、默认适配器

有时,我们定义的接口中包含多个方法,但是我们根据不同的需要,可能只用到接口中的一个或几个方法,不必重写接口中所定义的所有方法,这就需要用到默认适配器类。其核心思想是:为原接口实现一个默认的抽象类,在抽象类中编写每一个接口方法的默认实现。当我们需要编写一个具体类时,只要继承该抽象类,实现需要的重写方法即可。 

例如,在Java的图形用户界面中,矿口侦听WindowListener接口定义了7个接口方法,源码如下:

public interface WindowListener extends EventListener 

    public void windowOpened(WindowEvent e);

    public void windowClosing(WindowEvent e);

    public void windowClosed(WindowEvent e);

    public void windowIconified(WindowEvent e);

    public void windowDeiconified(WindowEvent e);

    public void windowActivated(WindowEvent e);

    public void windowDeactivated(WindowEvent e);

 要实现这个接口,我们就必须实现它所有的方法。但是实际上很少用到所有方法。为了不用实现多余的方法,jdk WindowListener 提供了一个WindowListener的默认实现类:WindowAdapter,这是一个抽象类,其源码如下:

public abstract class WindowAdapter
    implements WindowListener, WindowStateListener, WindowFocusListener

    public void windowOpened(WindowEvent e) 

    public void windowClosing(WindowEvent e) 

    public void windowClosed(WindowEvent e) 

    public void windowIconified(WindowEvent e) 

    public void windowDeiconified(WindowEvent e) 

    public void windowActivated(WindowEvent e) 

    public void windowDeactivated(WindowEvent e) 

    public void windowStateChanged(WindowEvent e) 

    public void windowGainedFocus(WindowEvent e) 

    public void windowLostFocus(WindowEvent e) 

WindowAdapter 类对WindowListener 接口的所有方法都提供了空实现。有了WindowAdapter类,我们只需要继承WindowAdapter,然后选择我们所关心的方法实现即可。

示例:

public class Test2 
    public static void main(String[] args) 
        JFrame jFrame = new JFrame("Window");
        //使用匿名内部类 选择实现其中的一个方法即可
        jFrame.addWindowListener(new WindowAdapter() 
            @Override
            public void windowClosing(WindowEvent e) 
                System.exit(0);
            
        );
        jFrame.setSize(200, 200);
        jFrame.setVisible(true);
    

(十六)设计模式总结

设计模式分为三类:

  1. 创建型模式
    • 单例模式
    • 工厂方法模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
  2. 结构型模式
    • 适配器模式
    • 装饰模式
    • 桥接模式
    • 组合模式
    • 享元模式
    • 代理模式
    • 外观模式
  3. 行为型模式
    • 观察者模式
    • 模板方法模式
    • 命令模式
    • 状态模式
    • 职责链模式
    • 解释器模式
    • 中介者模式
    • 访问者模式
    • 策略模式
    • 备忘录模式
    • 迭代器模式

以上是关于Java设计模式(十六)—— 适配器模式的主要内容,如果未能解决你的问题,请参考以下文章

(十六)设计模式总结

java设计模式 GOF23 05 适配器模式

Java 设计模式系列适配器模式

Java设计模式-适配器模式

java设计模式之适配器模式以及在java中作用

设计模式 | 结构型设计模式对比(十六)