回调函数在JAVA中使用频繁,比如Swing可视化编码中的监听事件等等,一般回调函数都是,通过某一个方法的执行,自动调用回调对象的回调方法,比如,有一个接口,里面有一个方法onNotify(),这个方法是一个回调方法,表明当触发事件发生时候,该调用的方法,举个例子:

一个回调接口

/**
 *  @author minliangzhi
 *  @date 2016年9月8日
 */
public interface ICallBack {

    void onNotify();
}

一个具体的实体对象,会出发回调函数的执行:

/**
 *  @author minliangzhi
 *  @date 2016年9月8日
 */
public class Task {
    private ICallBack callBack;

    public Task(ICallBack callBack) {
        this.callBack = callBack;
    }

    public void doSomething() {
        callBack.onNotify();
    }
}

具体的使用方法为:

    public static void main(String[] args) {
        new Task(new ICallBack() {

            @Override
            public void onNotify() {
                System.out.println("我是回调方法");
            }
        }).doSomething();
    }

通过调用实体对象的方法,就会触发回调函数对象的回调方法,我们这里只是简单的使用了一个匿名类的方法提供了回调对象。

由此,我们可以分析下观察者模式的具体含义和一般实现:

观察者模式可以分成两部分,一部分是发布者,一部分是观察者,发布者的某些方法,会通知所有的观察者,让他们知晓发布者的发布信息。

观察者:

/**
 *  @author minliangzhi
 *  @date 2016年9月8日
 */
public interface Observer {

    void onNotify(String content);
}

public class Mike implements Observer {

    @Override
    public void onNotify(String content) {
        System.out.println("Mike get : " + content);
    }
}

public class Bob implements Observer {

    @Override
    public void onNotify(String content) {
        System.out.println("Bob get : " + content);
    }

}

上述定义了两个观察者,下面定义一个发布消息者:

/**
 *  @author minliangzhi
 *  @date 2016年9月8日
 */
public interface Publisher {

    /**
     * 注册一个观察者
     * @param observer
     */
    void registObserver(Observer observer);

    /**
     * 移除一个观察者
     * @param observer
     */
    void removeObserver(Observer observer);

    /**
     * 通知所有的观察者
     */
    void notifyAllObserver();
}

一个具体的实现类,工作发布者Hunter:

/**
 *  @author minliangzhi
 *  @date 2016年9月8日
 */
public class Hunter implements Publisher {

    private List<Observer> observer;

    private String jobContent;

    public void setJob(String content) {
        this.jobContent = content;
    }

    public Hunter() {
        this.observer = new ArrayList<Observer>();
    }

    @Override
    public void registObserver(Observer observer) {
        this.observer.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        this.observer.remove(observer);
    }

    @Override
    public void notifyAllObserver() {
        for(Observer ob : observer) {
            ob.onNotify(jobContent);
        }
    }
}

使用方法:

    public static void main(String[] args) {
        /** 构造发布者和观察者,并注册 */
        Hunter hunter = new Hunter();
        Observer bob = new Bob();
        Observer mike = new Mike();
        hunter.registObserver(bob);
        hunter.registObserver(mike);
        /** 发布消息,通知所有观察者 */
        hunter.setJob("JAVA");
        hunter.notifyAllObserver();
    }

JAVA回调机制和观察者模式实例分享的更多相关文章

  1. java回调机制及其实现(转)

    1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...

  2. Java回调机制总结

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...

  3. 转:一个经典例子让你彻彻底底理解java回调机制

    一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ...

  4. Java基础9:解读Java回调机制

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  5. JAVA回调机制(CallBack)详解

    序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...

  6. 深入浅出: Java回调机制(异步)

    一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 回调 ...

  7. JAVA 回调机制(callback)

    序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回 ...

  8. [转]JAVA回调机制(CallBack)详解

    看见一篇博客比较通俗的解释了回调机制,转载一下,感谢原文作者Bro__超,原文地址:http://www.cnblogs.com/heshuchao/p/5376298.html 序言 最近学习jav ...

  9. JAVA回调机制解析

    一.回调机制概述     回调机制在JAVA代码中一直遇到,但之前不懂其原理,几乎都是绕着走.俗话说做不愿意做的事情叫做突破,故诞生了该文章,算是新年的新气象,新突破!     回调机制是什么?其实回 ...

随机推荐

  1. ProgressBar---进度条

    最近在处理标题进度条时,耗费了一些时间,现在总结一下ProgressBar的相关知识,有不对的地方请大神们批评指正! 进度条主要有以下三种: 1.对话框进度条 2.标题进度条 注意:requestWi ...

  2. NXP NFC移植及学习笔记(原创)

    NFC功能介绍 NFC 目前使用的三种功能: 1. P2P模式:基于LLCP协议的基础上,以NDEF数据交换格式来通信. 2. 读写模式:当作为读卡器,对NFC Tag的读写. 3. 卡模拟模式:模块 ...

  3. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  4. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

  5. 深入HashMap

    HashMap: 内部基于数组和单向链表 重要的变量有: Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE:结点数组table中存 ...

  6. rdlc报表相关

    错误提示:1.尚未指定报表定义的来源 注意ReportPath与ReportEmbeddedResource的区别,前者获取或设置本地报表的本地文件系统路径,设置此属性将导致后者属性值被忽略:后者将获 ...

  7. 【转】理解 PHP 依赖注入 | Laravel IoC容器

    Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,减少初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据 ...

  8. php Your system does not support any of these drivers: gmagick,imagick,gd2

    缺少这些库时,安装 : apt-get install php5-gd 就可以.

  9. C#序列化

    1.序列化一般有2种(XML和2进制),简单对象序列化 using System; using System.IO; using System.Runtime.Serialization.Format ...

  10. 图文介绍如何在Eclipse统计代码行数(转)

    使用Eclipse可以方便的统计工程或文件的代码行数,方法如下: 1.点击要统计的项目或许文件夹,在菜单栏点击Search,然后点击File... 2.选中正则表达式(Regular expressi ...