美文网首页
技术01:对于事件的理解

技术01:对于事件的理解

作者: 微弱的倾诉者 | 来源:发表于2018-04-21 21:45 被阅读15次

    提出问题:手机上有个“开灯”按钮,当用户点击后手电筒灯亮了,怎么用事件来描述这个过程?

    分析问题:什么是一个事件?举个例子,小明走路不小心摔跤了,哭了。就包含了一个事件!

    事件源:小明

    事件:摔痛

    动作:哭了

    小明为什么会哭,因为摔痛了,所以事件源本身应具有产生事件的能力。也就是说小明是健康的(具有感知疼痛的能力),由于摔痛了,才会哭的。

    再去思考开灯,这个开灯按钮就是事件源,它具有从底层获取用户 是否操作了它 这个事件的能力,灯亮只是当前这个事件产生后做出的一个动作。

    手机是怎么设计这个按钮的呢?我们自己又该如何设计这样的一个事件呢?

    思路:可以让按钮通过底层实时监听用户的操作,当收到用户点击这个操作的时候就去做开灯的动作。

    假如:

    事件源类定义为Button

    事件类定义为Event

    动作类定义为Action

    则事件流程:必需让Button实现实时获得用户操作的能力─>Button收到用户点击操作的事件─>Button调用Action类执行开灯的动作。

    可以看到,整个事件的执行流程都是由Button来主导完成的。

    也就好比小明摔倒,痛到哭的整过过程都是由小明来完成。

    (事件源必需有获得事件的能力才能去处理!就好比一个条件语句,条件成立才能执行!)

    细化这个过程可以得到的小明,摔倒(感知痛)、哭三要素,核心是小明有感知痛的能力即获得事件,所以不只是小明,可能小王,小芳等只要具有这个感知疼痛的能力就可以去做出哭或者笑或者毫无表情等不同反应。可以看出,具体的人是可变的,痛后的表现也可以是不同的。

    简化上述情形:人痛后做出反应!

    如何以不变应万变?那就需要把具体的小明,小王,小芳抽象为人(事件源),把哭,笑,毫无表情抽象为动作。也就是“人具有感知疼痛的能力,当感知到痛(事件)的时候就去做出动作”

    在Android中,Button的抽象就是View,它具有获得用户是否操作它的能力并把用户的操作封装成事件Event实例,再交给获得这个事件的View去处理。

    那特定的某个Button是怎么区分和处理用户操作自己的这个事件呢?

    这就是java中继承和多态的知识了,Button继承View,所以就有获得事件的能力也就是说在这个父类View中具有接受底层传递过来事件的方法,虽然这个方法获得了事件但并没有真正处理,而是在方法中通过判断子类是否实现了setXxx(接口 )方法中的接口来判断是否执行此setXxx()方法,这就回传给了子类实现。

    不理解?

    首先得理解什么是ioc控制反转:

    举个例子,

    小明想买手机,来到手机店,问老板:手机多少钱?

    这时老板并不会马上告诉小明价格而是反问道:你买什么型号的手机?

    小明说:小米5s.

    手机店老板:2000块。

    View就好比手机店的老板,

    Button就好比小明,

    注册事件就好比小明问老板这个动作,

    实现处理事件逻辑就好比知道了手机价格,

    也就是说老板是完全知道自己所有手机型号及价格的(View具有获得用户操作并产生事件的能力),不管谁来问,只要报上型号老板就能给出相应的价格。也就是说,不管是Button1还是Button2只要谁注册并实现了View的事件处理逻辑(报上了手机型号),View就能让谁来处理它(老板就告诉他价格)。

    java中表现在:子类调用父类的方法,父类的这个方法中包含未实现的方法即抽象方法。而这个抽象方法又是子类必须实现的,所以就产生子调父,父再回调子这种行为。

    如果不是继承关系如何设计这种控制反转呢?首先能够互调必需双方都持有彼此的引用,也就是你中有我,我中有你:

    举例子:

    A类中有a方法,B类有形参为A的引用的b方法.

    首先A必须通过某种方式已经持有B的引用了。

    这时A调用B的b方法并传入自己,这时b这个方法中就可以去调用传过来的A的a方法了(回调A)。

    当然在Android的设计中这种设计并不会那么明显,因为这样会产生强耦合,怎么解耦?让父辈耦合,子辈就可以不用和子辈直接打交道了,想打交道就去找他老爸,这样,子辈依赖子辈就变成了子辈依赖父辈了,也就是“面向接口编程”,其实就是面向父辈编程。

    解耦有啥好处,为啥要解耦,强依赖也挺好?

    简单的A依赖B,B依赖A是没什么问题的!只是,如果A和View一样实现了实时获得底层事件的方法,则另一个A出来也要再实现一次,这样是不合理的,所以才有继承,才有父辈,让父辈去完成这种通用的操作,各个子辈复用就好了!这样解决了重复工作的问题,那我还是可以子辈调子辈啊?是可以的,但是有个问题,也就是子辈的多样性,子辈的骚操作可能千变万化,如何把控这种变化?这就产生了多态(子类实例化父类),也就是子类再多,我们都可以用父类来承接,父类相同方法却因承接不同子类实例而产生不同行为。有了多态才可以以不变应万变,解决了依赖子类很难应付多变的子类(扩展和变化)的问题。

    相关文章

      网友评论

          本文标题:技术01:对于事件的理解

          本文链接:https://www.haomeiwen.com/subject/cwvflftx.html