针对Android的重新认识OOP(下)

来源:互联网 发布:编程培训班多少钱 编辑:程序博客网 时间:2024/06/15 00:51

<基类/子类>结构的接口

卡榫函数(Hook函数) - 指的是接口中的方法函数,起结合基类与子类,实现PnP(Plug and Play)的作用,所谓PnP,通俗来讲,就是能够自由地接上,拔下,自由更换的意思,能够跨平台适用。

Template Method设计模式为例

AbstractClass(基类)通过两个Hook函数与子类相连接,原理:ConcreateClass(子类)重写了Hook函数,从而使基类与子类建立了关联,基类在调用这两个Hook函数时候会调用子类重写的两个方法。

卡榫函数(Hook函数)及应用框架之基本原则:将变化的(Variant)与不变化的(Invariant)分离,一般而言,分离之后将不变的部分写在父类中,变化的部分写在子类中,而其目的就是为了让基类可以被复用。

IoC机制(Inversion of Control),继承体系中,基类函数可以主动调用子类函数(反向),而子类函数调用基类函数则是(正向)
,而基类函数主动调用子类函数正是典型的IoC机制。
基类与子类间,控制权在基类上(因为可以通过Hook函数调用子类函数),因为通常基类先写而子类后写,基类(前辈)拥有控制权控制子类(后辈)的情况,称作控制反转
* 默认行为(Default函数)
基类有一个重要功能:可事先定义一定量的默认(预设)行为供子类继承或者调用。

主动型与被动型API

首先通过例子来进行初步了解:

解析:
1. 基类通过Hook函数调用子类具体函数这种IoC机制的调用形式称做主动型API
2. 子类正向调用基类,站在基类角度,是被调用的,因此称为被动型API

也就是说,主要是在基类的角度来区分两者的。
1. 由基类定义并实现某个方法,而由子类来调用,即是被动型API
2. 由基类定义某个方法,而由子类来实现,最终由基类本身来调用该方法,即是主动型API(实现该种方法弹性更高,设计更科学)

历史上的一些应用?
1. 先举一个反例,1990年代初,Orbix 系统使用了被动型API,子类调用基类定义并实现的方法,当子类越来越多的时候,那么被调用的基类的方法就被固定死了,因为稍有改动就会影响到全部调用它的子类,这里子类指应用程序,而基类指系统。主动权在子类上,因此该系统不久就走向了灭亡。

  1. Windows 系统采用了主动型API,95年时采用COM/DCOM框架定义了一个接口,而应用程序则需要实现这样一个接口,最后被该系统框架调用,控制权在系统中;

  2. 2001年改进后采用了.NET框架,建立了基类子类结构,而COM/DCOM额外定义了接口,没有基类子类的结构;.NET框架通过Hook函数与应用程序相连接,实现IoC机制,系统掌握全部控制权;但其中也有被动型API,但需要在调用主动型API的前提下才能调用被动型API。

因此,API十分重要,接口(Interface)是连接的关键,拥有接口的控制权,则拥有了主导的地位

Android中的API范例

Activity:
开发过程中,能够实现各种各样的功能与效果,看似很自由,实际上,我们都是在根据需求来实现一些系统接口,而这些接口正是掌握在Google定义的Activity基类中,再仔细看。

onCreate方法为例
实现原理:Activity基类先调用onCreate方法接口,而onCreate这个接口又连接到UserActivity(开发者写的Activity)子类中的onCreate方法。
即:onCreate这个接口是Activity基类定义的,再通过UserActivity子类实现,最后由Activity基类调用UserActivity的具体实现。
* 再看onClickListener的onClick方法,由基类OnClickListener来定义,由App开发者来实现,最后由OnClickListener基类来调用。Android中主动型API处处可见。

总结,接口与类

OOP中,将接口定义为一种特殊的类。因为OOP中,一切都是由类构成的。
C++中类别有三种:
1. 具象类(所有函数都是有具体实现的)
2. 抽象类(有一个或者多个函数是抽象的)
3. 纯粹抽象类(全部函数都是抽象的,而Java中将该类别称为接口-Interface

IoC机制在Java中的实现(也就是我们最常用的使用接口实现类
以Runnable接口为例
直接来看,Task与Thread是通过Runnable接口来进行关联的,并不存在基类子类的关系,但是因为Thread的构造方法需要传入一个Runnable接口的实现类,可以认为Thread类内部有一个Runnable接口,再将Runnable接口中的run方法放入Thread类中,而Task实现了Thread定义的run方法,那么Thread与Task的基类子类关系就成立了。

IoC机制代码简单实现

class Task implments Runnable{    public void run(){        //...    }}public class JMain{    public static void main(String[] args){    Thread t = new Thread(new Tasks());    t.start();    }}

学习资源推荐

Android从程序员到架构师之路系列视频 - 高焕堂;

0 0
原创粉丝点击