事件驱动编程

看完公司的基于Netty的游戏框架,框架中用到了多态,函数式编程和事件驱动编程,第一次看到事件驱动的时候,就想到跟观察者模式很像.

事件驱动初上手感觉还很好用,在我自己写的项目里,要写很多爬虫,比如下面爬虫的例子,我只是想关心拼接URL地址,和关心不同的网站怎么解析DOM元素,写一个回调就好

多态,函数式编程和事件驱动编程,这三个还是然让我学到很多,可以用一个框架的基础,比如在Netty中,继承SimpleChannelInboundHandler<TextWebSocketFrame>,实现这里里面的方法,就能接收到请求,很方便.

1.JAVA回调的例子

/**
 * @Description java回调
 * @Author Anthony
 * @Date 2019/6/15
 */

interface Callback {

    Map<String,String> parse(String html);
}

public class CallbackDemo {

    // 爬虫工具类
    static Map<String,String> send(String URL, Callback callback) {

        // 模拟爬虫返回的数据
        String spiderResponse = "";

        if ("http://www.baidu.com".equals(URL)) {
            spiderResponse = "name=baidu&age=23";

        }else if("http://www.qq.com".equals(URL)){
            spiderResponse = "name=mahuateng&age=24";
        }

        // 回调方法
        return callback.parse(spiderResponse);
    }

    public static void main(String[] args) {
        String URL = "http://www.baidu.com";
        Map<String, String> send = send(URL, gbk -> {

            Map<String, String> map = new HashMap<>();

            // 切分&
            String[] split = gbk.split("&");

            // name
            map.put(split[0].split("=")[0], split[0].split("=")[1]);

            // age
            map.put(split[1].split("=")[0], split[0].split("=")[1]);

            return map;
        });
        System.out.println(send.get("name"));
    }
}

这样写各种简单的java爬虫的时候,只需要关心URL,和怎么分析爬虫返回的数据

2.观察者模式中的多态的例子

/**
 * @Description JAVA多态
 * @Author Anthony
 * @Date 2019/6/15
 */

abstract class MyCallback {

    void method(){
        System.out.println("method");
    }

    void method2(){
        System.out.println("method2");
    }
}

class MyImpl extends MyCallback {

    @Override
    void method() {
        System.out.println("Myimpl method");
    }
}

public class Demo {

    public static void main(String[] args) {
        MyCallback impl = new MyImpl();
        impl.method();
        impl.method2();
    }
}

3.观察者模式的例子

参考的是菜鸟教程中设计模式的例子

import java.util.ArrayList;
import java.util.List;

/**
 * @Description 观察者模式
 * @Author Anthony
 * @Date 2019/6/15
 */

/**
 * 创建 Observer 类。
 */
abstract class Observer {
    Subject subject;
    public abstract void update();
}

/**
 * 创建 Subject 类。
 */
class Subject {

    // 最重要的地方
    private List<Observer> observers = new ArrayList<>();

    private int state;

    int getState() {
        return state;
    }

    void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }

    void attach(Observer observer){
        observers.add(observer);
    }

    // 最重要的地方
    private void notifyAllObservers(){
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

/**
 * 创建实体观察者类。1
 */
class BinaryObserver extends Observer{

    BinaryObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println( "BinaryObserver: "+ Integer.toBinaryString( subject.getState() ) );
    }
}

/**
 * 创建实体观察者类。2
 */
class OctalObserver extends Observer{

    OctalObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println( "OctalObserver: " + Integer.toOctalString( subject.getState() ) );
    }
}

public class Demo{
    public static void main(String[] args) {
        Subject subject = new Subject();

        new OctalObserver(subject);
        new BinaryObserver(subject);

        System.out.println("第一次状态改变: 15");
        subject.setState(15);

        System.out.println("第二次状态改变: 10");
        subject.setState(10);
    }
}

打印结果:

第一次状态改变: 15
OctalObserver: 17
BinaryObserver: 1111
第二次状态改变: 10
OctalObserver: 12
BinaryObserver: 1010

事件驱动编程

虽然看了事件驱动的定义,虽然知道是什么意思,但是不知道该怎么说出来,大概就是,写个while循环遍历队列,或者集合的中数据

/**
 * @Description 事件驱动编程
 * @Author Anthony
 * @Date 2019/6/15
 */

interface ClickCall{
    String click(String msg);
}

class MyTask{

    protected String msg;

    protected ClickCall clickCall;

    public MyTask(String msg,ClickCall clickCall) {
        this.msg = msg;
        this.clickCall = clickCall;
    }
}

public class Demo {

    // java 栈,也可以当做是队列之类
    public static Stack<MyTask> list = new Stack<>();

    public static void main(String[] args) throws InterruptedException {

        // 模拟鼠标点击
        list.push(new MyTask("右键",msg->{
            return "右手点击鼠标"+msg;
        }));

        list.push(new MyTask("左键",msg->{
            return "左手点击鼠标"+msg;
        }));

        // 启动一个线程循环List
        new Thread(() -> {

            while (true && !list.empty()) {

                // pop 方法,从栈顶移除一个,并打印出来
                MyTask pop = list.pop();
                System.out.println(pop.clickCall.click(pop.msg));
            }

        }).start();

    }
}

参考
我的博客:http://yanganlin.com

原文地址:https://www.cnblogs.com/yal950727/p/11028482.html

时间: 2024-10-10 13:52:19

事件驱动编程的相关文章

Linux的I/O模式、事件驱动编程模型

大纲: (1)基础概念回顾 (2)Linux的I/O模式 (3)事件驱动编程模型 (4)select/poll/epoll的区别和Python示例 网络编程里常听到阻塞IO.非阻塞IO.同步IO.异步IO等概念,总听别人装13不如自己下来钻研一下.不过,搞清楚这些概念之前,还得先回顾一些基础的概念. 1.基础知识回顾 注意:咱们下面说的都是Linux环境下,跟Windows不一样哈~~~ 1.1 用户空间和内核空间 现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内

图形用户界面编程——事件驱动编程

根据事件发生而执行代码的编程方式,称为事件驱动编程 事件源——>监听——>处理事件(处理函数) ps:实现按键全选和反选 运行结果图

关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有童鞋说我这篇文章理论化很严重,没有实际代码和具体项目做支撑,这个评论让我有种理论和实践脱节的味道,所以我想在这里谈谈我为什么要写这篇文章的原因,这篇文章是把我前不久学习多线程编程的一个总结. 当我从我书堆里找到所有与多线程开发相关的书籍简单阅读后,我发现了一个问题,在java里开发多线程最强有力的实践就是做服

js 中的事件驱动编程

js 中的事件驱动编程,布布扣,bubuko.com

dojo事件驱动编程之事件绑定

什么是事件驱动? 事件驱动编程是以事件为第一驱动的编程模型,模块被动等待通知(notification),行为取决于外来的突发事件,是事件驱动的,符合事件驱动式编程(Event-Driven Programming,简称EDP)的模式. 何谓事件?通俗地说,它是已经发生的某种令人关注的事情.在软件中,它一般表现为一个程序的某些信息状态上的变化.基于事件驱动的系统一般提供两类的内建事件(built-in event):一类是底层事件(low-level event)或称原生事件(native ev

Android事件驱动编程-基于EventBus(二)

Android事件驱动编程(二) --欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢-- 原文链接:https://medium.com/google-developer-experts/event-driven-programming-for-android-part-ii-b1e05698e440 本文Gitbooks链接:http://asce1885.gitbooks.io/android-rd-senior-adv

Android事件驱动编程-基于EventBus(一)

Android事件驱动编程-基于EventBus(一) --欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢-- 原文链接:https://medium.com/google-developer-experts/event-driven-programming-for-android-part-i-f5ea4a3c4eab 本文Gitbooks链接:http://asce1885.gitbooks.io/android-rd-

12.队列的应用-事件驱动编程

1.事件驱动编程 前面我们提到队列在操作系统中用的非常多,其中一大应用就是基于事件驱动的消息队列机制,熟悉Windows SDK程序设计的对于Windows的消息产生.分发.处理应该不会陌生. 事件驱动编程简而言之就是应用程序维护一个或多个事件队列,完全以事件队列为主线来设计和编写整个程序.如Windows就是以消息队列为中心来对每个消息进行处理从而实现事件驱动编程(如鼠标.键盘等事件的处理). 2.离散事件模拟 现在为了演示事件驱动编程,我可能并没有能力去构建一个windows消息系统,这里以

事件驱动编程——《Unix/Linux编程实践教程》读书笔记(第7章)

1.curses库 /* 基本curses函数 */ initscr(); // 初始化curses库和tty endwin(); // 关闭curses并重置tty refresh(); // 使屏幕按照你的意图显示 move(r, c); // 移动光标到屏幕的(r, c)位置 addstr(s); // 在当前位置画字符串s addch(c); // 在当前位置画字符c clear(); // 清屏 standout(); // 启动standout模式(一般使屏幕反色) standend

理解Node.js事件驱动编程

Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现). 但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势? Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架.nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的 性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方mo