zoukankan      html  css  js  c++  java
  • 换一个角度理解委托和事件

    如果你还为委托和事件犯迷糊,你可以试着回答下面这些问题:
    让你来设计一个框架(或者程序)实现效果:点击button时实现label1.text=“呵呵,第一次点击!”,你会怎么处理?注意,不要用.net已经实现的框架。
    我们会想,在windows系统里应该有一个监听程序,专门处理鼠标点击事件,一旦button被点击,他就会执行一定的程序。大概应该像下面的伪代码一样:
    ListenerMethod(){
    if(button.clicked)
    {……}
    }
    我就可以在{}里写上label1.text=“呵呵,第一次点击”,搞定!
    如果要实现其他内容,比如再一次点击,就label.text=“没问题,第二次点击”。
    到此为止,你发现问题么?
    如果还没有发现,呵呵,你就有问题了。
    我也是在学习了“设计模式”之后才想到的,如果按上面的方法实现,就:
    1、你必须把ListenerMethod()方法的具体内容公布出来,不然人家怎么用呢,这些执行的代码写在哪里呢?
    2、把方法公开是不好的,为什么?最简单的,怕人家看了干坏事呀,黑客是怎么出来的?呵呵,这其实只是一方面,更实际的原因甚至是防止自己误操作……不多说了,理解关键字“封装”!
    接着想,我要不把ListenerMethod()方法暴露出来要怎么办。
    可不可以事先写好一个方法,放在{}里,其他人在其他地方写实现的代码,如:
    ListenerMethod(){
    if(button.clicked){
    TheMethod();  //只要按钮被点击就执行这个方法;
    }
    }
    而在另外的地方设好方法名和参数,让其他人填空,如下
    TheMethod(){
    ……//里面的内容由其他人(专业点的词汇叫做“用户”)填写
    }
    哈哈,有点像了。我们好像也是这样在buttonClick()方法里写实现程序的哟。
    这样做,还是有问题,能不能想到?
    现在我们是一个button,如果有两个button要实现各自不同的的功能呢,怎么办?我写两个if,哼!三个呢,四个呢……实际上,我做框架的时候还根本不知道会有多少个呢,唉~~
    再想!
    这就要回到最前面猜想的地方了。button和Listener之间是不是要有对应关系?
    这种对应关系如何实现?
    我们可以想象,计算机系统里面有一个管理鼠标点击button的监听中心,每个button都可以到这个中心“注册登记”他对应的方法,这样,当特定的button被点击时,监听中心可以根据之前的“登记”,执行相应的方法。
    看上去上面的方法不错,赞自己一个。那么如何实现上面的构想呢?当然就是用委托和事件了。

    可能你还是没怎么搞明白,我也一样,那我们试着动手写程序吧。为了脱离winform之类已有的框架,我们建一个控制台程序。

    未使用委托、事件之前的代码。

    Code

    可以看出,以上的代码实现一个按钮是可行的,但两个按钮就麻烦了。不到黄河心不甘,我们硬着头皮再写两个按钮的情况吧。

    Code

    如果你是自己在试着写的话,估计你已经崩溃了(反正我是这样),不好办呀。如果看这段代码没有感觉的话,试着写一写。

    好了,看看微软是如何解决这个问题的吧。

    Code

    大功告成!欣赏一下吧,相当优雅的一个架构。如果还要再添加一个按钮和对应的事件,你会做了么?

    而在winform和asp.net中,给事件对应的方法添加了两个参数并规范了命名,就更完美了。

  • 相关阅读:
    根据不同运行环境配置和组织node.js应用
    python下pip使用bug汇总
    python的虚拟环境
    nginx使用手册--nginx的命令行参数
    nginx使用手册--nginx.conf文件配置详解
    使用async读取异步数据
    [Bootstrap]组件(三)
    [Bootstrap]组件(二)
    [Bootstrap]组件(一)
    [javascript|基本概念|一元操作符]学习笔记
  • 原文地址:https://www.cnblogs.com/freeflying/p/1421835.html
Copyright © 2011-2022 走看看