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当中的,如下:

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

  • 相关阅读:
    基于接口(工厂模式)三层架构的引用和访问流程
    数据库访问类小结
    是毁灭还是重生——从浏览器大战看未来软件发展
    Func,Action的介绍及其用法
    IIS发布程序后,出现“服务器应用程序不可用”的错误
    泛型委托 Action<T>和Func<T,TResult>
    IIS发布程序后,出现“服务器应用程序不可用”的错误
    利用winrar自动备份重要资料
    HDU 2795 Billboard
    HDU 1140 War on Weather
  • 原文地址:https://www.cnblogs.com/webor2006/p/8991832.html
Copyright © 2011-2022 走看看