zoukankan      html  css  js  c++  java
  • 适配器模式在Android中的应用

    工资翻倍篇之适配器模式

    先了解一下适配器的基本概念,然后再详细分析一些适配器的样例,最后通过Android开发中经常使用的适配器模式进行分析,保证对适配器模式理解透彻。

    适配器模式可分为三类:类的适配器、对象的适配器、接口的适配器。

    1、适配器的基本概念

    使用目的:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本因为接口不兼容而不能一起工作的那些类能够一起工作。



    1.1类适配器模式

    说明:

    当新接口出现的时候,因为和老的接口不兼容,这个时候,我们採用一个适配器类实现新的接口而且继承老的业务类,这样就能同一时候处理新老业务。

    演示样例代码:


    1.2对象适配器模式

    说明:当新接口出现的时候。因为和老的接口不兼容,这个时候。我们採用一个适配器类实现新的接口并在内部持有一个老业务逻辑的对象,这样就能把对老接口的调用所有中转给老的业务逻辑,从而解决接口的兼容性问题

    演示样例代码:


    1.3接口适配器模式

    说明:也叫缺省适配器模式,主要解决接口的复用问题:有时候可能我们的业务仅仅须要使用接口中的某一个方法而不是所有方法。可是因为接口的语言特性而 不得不实现所有的抽象方法。这样就会使得接口的使用过程非常麻烦,特别是接口中存在非常多抽象方法的时候。面对接口的这类问题。我们能够採用一个抽象类(也可 以不是抽象类)去实现接口。然后让我们的类去继承这个抽象类同一时候仅仅重写我们感兴趣的方法就可以。


    2、类的适配器和对象适配器的分析

    2.1类的适配器

    如上图,当我们的Client须要一个新功能的时候。我们定义了一个RequiredInterface,里面有我们须要实现的方法requiredMethod(),

    刚好这个requiredMethod()须要的功能已经在ExistingClass中实现了,ExistingClass是已经存在的一个类,里面有我们须要的方法usefulMethod()。这个时候,我们要做的就是创建一个NewClass新类,让他继承自ExistingClass,然后实现RequiredMethod,重写requiredMethod,将usefulMethod()的逻辑委派为requiredMethod,这样就实现了接口的适配了。

    类适配器样例

    火箭公司有一个火箭仿真事件EventSim,里面有非常多仿真的火箭RocketSim。RocketSim是一个接口,想要增加EventSim的火箭都必需要实现RocketSim接口。


    如今有一款火箭PhysicalRocket。这款火箭提供的功能和RocketSim相似。我们须要把这款火箭放到火箭仿真功能EventSim中,这个时候我们能够运用适配器模式,创建一个新的OozinozRocket继承PhysicalRocket同一时候实现RocketSim类。

    新的rocket就同一时候具有PhysicalRocket的属性和仿真属性了。

    同一时候我们须要将PhysicalRocket中的功能getBurnTme,getMass,getThrust委派给新的OozinozRocket的getMass,getThrust。

    这样一来OozinozRocket就能放到仿真功能EventSim中了。

    以上就是类的适配器。通过子类进行适配。 在类的适配器中。新的适配类OozinozRocket实现了须要的接口RocketSim,并继承了现有的类PhysicalRocket。

    当你须要适配的一组方法并不是被定义在接口中时,这样的方法就不奏效了。此时须要创建一个对象适配器,它使用了委派并不是继承。

    2.2对象适配器


    和上面的类的适配器进行比較能够发现,类的适配器中须要的是一个接口RequiredInterface,而对象适配器中须要的是一个类RequiredClass。

    这个时候就不能使用类的适配器了,而须要使用对象适配器。

    这里的NewClass是对象适配器的样例,NewClass实现了RequiredClass。这样就满足了client的须要,同一时候NewClass和ExistingClass是关联关系。ExistingClass是NewClass中的一个成员变量。


    对象适配器样例

    样例和上面类的适配器相似,只是多赘述

    这里的仿真事件中须要的不再是接口。而是一个Skyrocket类。

    我们的对象适配类OozinozSkyrocket实现了Skyrocket,内部并持有一个PhysicalRocket。由于子类仅仅能继承一个父类。所以OozinozSkyrocket想要具有PhysicalRocket的功能就必须持有一个PhysicalRocket对象,然后将须要的功能委派给OozinozSkyrocket。

    初始化的时候须要传入一个PhysicalRocket对象对内部持有的PhysicalRocket进行初始化。

    如此就将PhysicalRocket通过OozinozSkyrocket适配类适配成须要的Skyrocket类了。所以适配器的目的就是将一个类适配成须要的一个类。



    如今再来看开头的一些概念,就会认为清晰非常多了。

    可能你另一点模糊,可是你的功底已经练得差点儿相同了,只是就仅仅差打通任督二脉的那一股劲了。

    我们来看看android开发中我们常遇到的适配器模式。你就会豁然开朗了。

    3、Android中的适配器模式

    在开发android程序时。我们用到最多的适配器模式就是写listView的时候经常使用到的BaseAdapter。

    ListView控件大家再熟悉只是了。要想将一组数据显示到listView上,就必需要新建一个MyAdapter继承自BaseAdapter,然后

    listView.setAdapter(myAdapter);将我们的数据设置到listView控件上进行显示。

    所以我们必须将我们须要显示的一组数据适配成BaseAdapter,我们新建一个MyAdapter继承自须要的类BaseAdapter,然后内部持有我们须要显示的数据,这是典型的对象适配器。

    android中的ListView控件,在显示listView列表的时候,并非将每一组数据都硬塞给控件,而是定义了ListAdapter接口,ListView的实现使用了ListAdapter接口。我们的BaseAdapter实现了ListAdapter。然后我们提供了一个适配器,将数据转换为BaseAdapter。

    不仅是Android的ListView,Swing提供的显示列表的空间JTable也是用到了对象适配器。




  • 相关阅读:
    剑指offer-二维数组中的查找
    TF-IDF(term frequency–inverse document frequency)
    Java实现中文字符串的排序功能
    当前课程
    【R】资源整理
    CentOS相关
    【转】Setting up SDL Extension Libraries on MinGW
    【转】Setting up SDL Extension Libraries on Visual Studio 2010 Ultimate
    【转】Setting up SDL Extension Libraries on Code::Blocks 12.11
    【转】Setting up SDL Extension Libraries on Visual Studio 2019 Community
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7398926.html
Copyright © 2011-2022 走看看