zoukankan      html  css  js  c++  java
  • java设计模式-适配器模式

    概念:

      适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。

    分类:

    1 类适配器

    2 对象适配器

    3 接口适配器

    一  类适配器:

        通过继承来实现适配器功能,

    当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后再继承接口B的实现类BB,这样我们可以在适配器P中访问接口B的方法了,这时我们在适配器P中的接口A方法中直接引用BB中的合适方法,这样就完成了一个简单的类适配器。

      详见下方实例:我们以apple与android的充电线转接为例,让安卓充电线可以给苹果手机充电

    安卓接口

    //安卓接口
    public interface Android
    { 
        void isAndroid(); 
    }

    苹果接口

    //苹果接口
    public interface Apple
    {
        void isApple();
    }

    苹果接口实现类

    //苹果接口实现类
    public class ApplerUser implements Apple
    { 
        //实现苹果接口
        void isApple()
        {
            System.out.println("我可以给苹果手机充电")
        }
    }

    //适配器

    //适配器
    public class Adapter extends ApplerUser implements Android
    {
        void isAndroid();
        {
               this.isApple();
        }
    }

    测试类

    public class Test
    {
        public static void main(String args[])
        {
            Android android = new Adapter ();
            android.isAndroid();
        }
    }

    输出结果:我可以给苹果手机充电

    适配器Adapter的作用就是,把安卓充电线转换为具有苹果充电线功能(可以给苹果手机充电)

    二  对象适配器

    原理:通过组合来实现适配器功能。

    当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后在适配器P中定义私有变量C(对象)(B接口指向变量名),再定义一个带参数的构造器用来为对象C赋值,再在A接口的方法实现中使用对象C调用其来源于B接口的方法,

    详见下方实例:我们以apple与android的充电线转接为例,让安卓充电线可以给苹果手机充电

    安卓接口

    //安卓接口
    public interface Android
    { 
        void isAndroid(); 
    }

    苹果接口

    //苹果接口
    public interface Apple
    {
        void isApple();
    }

    苹果接口实现类

    //苹果具体实现类
    public class ApplerUser implements Apple
    { 
        //实现苹果接口
        void isApple()
        {
            System.out.println("我可以给苹果手机充电")
        }
    }

    //对象适配器

    //对象适配器
    public class Adapter  implements Android
    {
        //苹果接口对象
        private Apple apple;
    
        public Adapter(Apple apple)
        {
             this.apple = apple;
        }
       
       //实现安卓接口
        void isAndroid();
        {
            this.apple.isApple();
        }
    }

    测试类

    public class Test
    {
        public static void main(String args[])
        {
            Android android = new Adapter (new Apple());
            android .isAndroid();
        }
    }

    输出结果:我可以给苹果手机充电

    适配器Adapter的作用就是,把安卓充电线转换为具有苹果充电线功能(可以给苹果手机充电)

    三  接口适配器模式

    原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配

    当存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,哪怕我们仅仅是对不需要的方法进行置空(只写一对大括号,不做具体方法实现)也会导致这个类变得臃肿,调用也不方便,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么我们在创建抽象类的继承类,而且重写我们需要使用的那几个方法即可

    //拥有一些列方法的接口

    public interface A
    {
        void  a();
        void b();
        void c();
        void d();
    }

    //适配器

    //适配器
    public abstract class Adapter implements A
    {
        void  a(){}
        void b(){}
        void c(){}
        void d(){}
    }

    //实现类(因为实际需要,只需要实现a,b 方法就能满足业务要求)

    //实现类
    public class  Shixian extends Adapter 
    {
        void a()
        {
           system.out.println("实现a方法");
        }
    
        void b()
        {
           system.out.println("实现b方法");
        }
    }

    //测试类

    public class Test
    {
        public static void main(String args[])
        {
             A  a = new Shixian ();
             a.a();
             a.b();
        }
    }

    //输出

    实现a方法

    实现b方法

    四 适配器模式应用场景

    类适配器与对象适配器的使用场景一致,仅仅是实现手段稍有区别,二者主要用于如下场景:

      (1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。

      (2)我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。

      以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。

    接口适配器使用场景:

      (1)想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。这个抽象类就是适配器。

  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/hup666/p/10473652.html
Copyright © 2011-2022 走看看