设计模式中Adapter模式

217 阅读1分钟

1、为什么要有Adapter

  • 考虑以下情况,在已有的轮子中以及实现了某一功能,我们的项目只是修改了某一方法,如果要修改全部的代码无疑是困难的且没必要的,这时便出现了适配器(Adapter)模式,我们不需要修改源代码便能得到相同的功能,实现了对资源的重复利用

可以类比生活中的插头适配器来理解,通过适配器能够将两孔的插头插到三孔插座上,并且不影响原功能的正常使用。(图源网络)

image.png

Adapter有两种实现方式,两种实现方式是根据原代码中给定的约束不同自主选择的

  • 基于继承的适配器
  • 基于委托的适配器

2、实现实例

2.1、原接口

public interface Print {
     void Print_a();
     void Print_b();
}

2.2、新功能

public class Banner {
    void print_A() {
        System.out.println("---------A-----------");
    }
    void print_B() {
        System.out.println("---------B-----------");
    }
}

2.3、基于继承的适配器

在Baner类之上,我们封装一层BannerAdapter类,这里的继承指的是继承Banner类

public class BannerAdapter extends Banner implements Print{
    @Override
    public void Print_a() {
        print_A();
    }

    @Override
    public void Print_b() {
        print_B();
    }
}

这样即使不改变原代码,也能使用新的Banner内中的功能

public class test {
    public static void main(String[] args) {
        print(new BannerAdapter());
    }

    public static void print(Print printer) {
        printer.Print_a();
        printer.Print_b();
    }
}

运行结果:

image.png

2.4、基于委托的适配器

与2.3中基于继承不同是,在原代码中,Print是类而不是接口,因此要通过重写方法来实现新功能。

public class Print {
    void Print_a() {
        System.out.println("---------a-----------");
    }
    void Print_b() {
        System.out.println("---------b-----------");
    }
}

通过继承Print类来实现适配。

public class BannerAdapter extends Print {
    private static Banner banner=new Banner();
    @Override
    public void Print_a() {
        banner.print_A();
    }

    @Override
    public void Print_b() {
        banner.print_B();
    }
}

测试:

public class test {
    public static void main(String[] args) {
        print(new BannerAdapter());
    }

    public static void print(Print printer) {
        printer.Print_a();
        printer.Print_b();
    }
}

运行结果:

image.png