zoukankan      html  css  js  c++  java
  • 设计模式相关面试问题-适配器

    adapter模式详解:

    • 适配器模式定义
      将一个接口转换成客户端希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
    • 类适配器
      ①、类适配器定义:
      类适配器模式把适配的类的API转换成目标类的API。
      ②、UML结构图解析:

      ③、code详解:
      先定义Target接口:
      public interface Target {
      
          void sampleOperation1();
      
          void sampleOperation2();
      }

      再定义类Adaptee:

      public class Adaptee {
          public void sampleOperation1() {
              System.out.println("sampleOperation1");
          }
      }

      接着定义Adapter类:

      public class Adapter extends Adaptee implements Target {
          @Override
          public void sampleOperation2() {
              System.out.println("sampleOperation2");
          }
      }
      应用一下:

      ④、总结:
      a、类适配器使用对象继承的方式,是静态的定义方式。
      b、对于类适配器,适配器可以重定义Adaptee的部分行为。
      c、对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。
      d、对于类适配器,由于适配器直接继承了Adaptee,使用适配器不能和Adaptee的子类一起工作。
    • 对象适配器
      ①、对象适配器定义:
      与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。
      ②、UML结构图解析:

      ③、code详解:
      其Target接口还是跟之前类适配器一样:
      public interface Target {
      
          void sampleOperation1();
      
          void sampleOperation2();
      }

      Adaptee也跟之前类适配器一样:

      public class Adaptee {
          public void sampleOperation1() {
              System.out.println("sampleOperation1");
          }
      }
      接着不同点来啦,看此时的Adapter类:
      public class Adapter implements Target {
      
          private Adaptee adaptee;
      
          public Adapter(Adaptee adaptee) {
              this.adaptee = adaptee;
          }
      
          @Override
          public void sampleOperation1() {
              adaptee.sampleOperation1();
          }
      
          @Override
          public void sampleOperation2() {
              System.out.println("sampleOperation2");
          }
      }

      持有Adaptee的引用了,而不是继承至它,接着再应用一下:

      ④、总结:
      a、对象适配器使用对象组合的方式,是动态组合的方式。
      b、对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标。
      c、对于对象适配器,要重定义Adaptee的行为比较困难。
      d、对于对象适配器,需要额外的引用来间接得到Adaptee。

    adapter模式在android中的实际运用:

    ListView使用了adapter模式我想不多过多解析下,分如下两点进行:

    • UI
      先上张图:

      1、ListView的布局是由一条一条的Item组成的,这每一个Item又是一个View。通过Adapter适配器这个桥梁将View添加到ListView中。
      2、一个Adapter是AdapterView视图与数据之间的桥梁,Adapter提供对数据的访问,也负责为每一项数据产生一个对应的View。
      3、每一项数据产生对应的View之后,然后将View添加到ListView之中。
      4、属于MVC架构,其中Adapter属于C。
    • 源码
      跟ListView的recycleBin类似其adapter的定义是在ListView的父类当中,如下:

      此时在onAttachedToWindow()方法中看到有如下代码:

      而在此方法中也发现了另外一种模式:观察者,如下:

      这个模式不是此次探讨的重点,在未来会专门去研究。
      此时将观注点转移到这里来:

      所以回到ListView的layoutChildren()方法来查看,不过它的代码量实在太大,挑重点理解就行:

      然后再查看fillUp()方法:

      现定位到makeAndAddView()方法,其中定义到它:

      而这个方法其实是定义在它的父类AbsListView当中的,如下:

      而该方法的代码量也是非常之大,继续挑重点分析,如下:

  • 相关阅读:
    神器Tampermonkey的安装使用
    记一些不错的知识博客
    redis入门到精通系列(九):redis哨兵模式详解
    redis入门到精通系列(八):redis的高可用--主从复制详解
    redis入门到精通系列(七):redis高级数据类型详解(BitMaps,HyperLogLog,GEO)
    redis入门到精通系列(六):redis的事务详解
    redis入门到精通系列(五):redis的持久化操作(RDB、AOF)
    redis入门到精通系列(四):Jedis--使用java操作redis详解
    jsp乱码
    Tomcat 9遇到错误开着怎么关闭
  • 原文地址:https://www.cnblogs.com/webor2006/p/8991832.html
Copyright © 2011-2022 走看看