逸笔记-设计模式-结构型模式-适配器模式

2023-09-26  本文已影响0人  lovefy

1.什么是适配器模式

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

1.类的适配器模式

什么是类的适配器,顾名思义,就是通过类的继承,接口的实现来达到我们期望的输出值,有一个A类,其拥有一个方法method1,待适配,目标接口是B,通过C类(继承A类,实现B接口),从而将A的功能(method1方法)扩展到C里 如下

    public class A {

        public void method1() {
            System.out.println("这里是A");
        }
    }

    public interface B {

        public void method1();

        public void method2();
    }

    public class C extends A implements B {

        @Override
        public void method2() {
            System.out.println("这里是C");
        }
    }
    @Test
    public void test8(){
        B b = new C();
        b.method1();
        b.method2();
    }
image (1).png

这样B接口的实现类就具有了A类的功能

2.对象的适配器模式

基本思路和类的适配器模式相同,只是将C类作修改,这次不继承A类,而是持有A类的实例,以达到解决兼容性的问题。如下

   public class A {

        public void method1() {
            System.out.println("这里是A");
        }
    }

    public interface B {

        public void method1();

        public void method2();
    }

    public class C implements B {

        private A a;

        public C(A a) {
            this.a = a;
        }

        @Override
        public void method1() {
            a.method1();
        }

        @Override
        public void method2() {
            System.out.println("这里是C");
        }
    }
    @Test
    public void test8(){
        B b = new C(new A());
        b.method1();
        b.method2();
    }
image (2).png

3.接口的适配器模式

有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。如下

   public abstract class A implements B{

        public void method1(){};

        public void method2(){};
    }

    public interface B {

        public void method1();

        public void method2();
    }

    public class C1 extends A {

        @Override
        public void method1() {
            System.out.println("C1 method1");
        }
    }

    public class C2 extends A {

        @Override
        public void method2() {
            System.out.println("C2 method2");
        }
    }
    @Test
    public void test8(){
        A a1 = new C1();
        A a2 = new C2();
        a1.method1();
        a1.method2();
        a2.method1();
        a2.method2();
    }
image (3).png
上一篇 下一篇

猜你喜欢

热点阅读