java三种适配器模式详解与代码实现

zhaoyu

 

1. 适配器模式定义:

适配器模式是一种结构型设计模式,通过一个适配器类把具有不同方法功能的两个类A和B组合起来,使得这个适配器类同时具有两个类的不同的功能,调用方不管要使用A类的功能还是B类的功能,都可以通过调用适配器类来实现,不用再分别调用A和B;

举个栗子

用户新买了一件两孔插座的电器,但是家里只有一个三孔插座,这个时候怎么办呢?可以再买一个插座适配器,来做转化,把适配器插到三孔插座上,用户直接把电器插到适配器即可

主要角色:源对象,目标对象,适配器

2. 适配器分类

2.1 类适配器模式

通过继承特性来实现适配器功能,继承实现关系如下

源对象

/**
 * 两孔插座
 */
public class TwoHoleSocket {
    public void twoHole() {
        System.out.println("插入两孔插座");
    }
}

目标对象

/**
 * 三孔插座
 */
public interface ThreeHoleSocket {
    void threeHole();
}

适配器

/**
 * 适配器:可以同时使用两孔和三孔插座
 */
public class Adapter extends TwoHoleSocket implements ThreeHoleSocket{
    @Override
    public void threeHole() {
        System.out.println("插入三孔插座");
    }

    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.twoHole();//使用两孔插座
        adapter.threeHole();//使用三孔插座
    }
}

2.2 对象适配器模式

通过组合关系来实现适配器功能,ThreeHoleSocket和TwoHoleSocket没有变化

/**
 * 适配器
 */
public class Adapter implements ThreeHoleSocket{
    //通过组合持有两孔插座的对象,内部引用两孔插座来适配
    private TwoHoleSocket twoHoleSocket;

    public Adapter(TwoHoleSocket twoHoleSocket) {
        this.twoHoleSocket = twoHoleSocket;
    }

    public void twoHole() {
        twoHoleSocket.twoHole();
    }

    @Override
    public void threeHole() {
        System.out.println("插入三孔插座");
    }

    public static void main(String[] args) {
        Adapter adapter = new Adapter(new TwoHoleSocket());
        adapter.twoHole();//两孔插座
        adapter.threeHole();//三孔插座
    }
}

2.3 接口适配器模式

接口适配器模式也称作缺省适配模式,就是有时候一个接口的方法太多,我只想用其中的一两个,不想为其他方法提供实现,就可以通过一个抽象类为这个接口的所有方法,提供空实现,如果想用哪个方法,再提供一个子类继承这个抽象类,覆盖父类某个方法即可;

举个栗子:墙上有一个插座,支持三孔,两孔,和支持usb插口,但是我考虑到安全问题,不想把三孔和两孔插口暴漏出来,只留一个usb插口给手机充电用,应该怎么做呢?

插座接口

/**
 * 墙上插座
 */
public interface HallSocket {
    //两孔插口
    void twoHole();
    //三孔插口
    void threeHole();
    //usb插口
    void usbHole();
}

缺省实现类

/**
 * 抽象类:提供缺省实现
 */
public class AbstractAdapter implements HallSocket{
    @Override
    public void twoHole() {

    }

    @Override
    public void threeHole() {

    }

    @Override
    public void usbHole() {

    }
}

目标子类

public class UsbSocket extends AbstractAdapter{
    @Override
    public void usbHole() {
        System.out.println("usb插口");
    }

    //测试
    public static void main(String[] args) {
        UsbSocket usbSocket = new UsbSocket();
        usbSocket.usbHole();
    }
}

2.4 三种适配器模式的区别

  • 类适配器模式:通过继承源类,实现目标接口的方式实现适配,但是由于Java单继承的机制,这就要求目标必须是接口,有一定的局限性
  • 对象适配器模式,通过组合方式持有源类对象,可以把源类对象子类传进来,比类适配器模式更灵活
  • 接口适配器模式,借助中间抽象类空实现目标接口所有方法,子类选择性重写,可以减少实现不必要方法
posted @ 2021-07-09 16:53  abcdefghijklmnop  阅读(869)  评论(0编辑  收藏  举报