回调函数在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. 关于更新发布CSS和JS文件的缓存问题

    现如今,浏览器大战下,各个浏览器也是拼了命的提高性能,升级JS解析引擎,更好的处理浏览器的页面缓存,让用户的浏览体验更快,占用更小的PC资源.那么,问题就出现在JS和CSS缓存,甚至页面缓存上.至于浏 ...

  2. 《转载》跟我学spring3

    一.<跟我学spring3>电子书下载地址: <跟我学spring3>  (1-7 和 8-13) http://jinnianshilongnian.iteye.com/bl ...

  3. Android带图片的Toast(自定义Toast)

    使用Android默认的Toast Toast简介: Toast是一个简单的消息显示框,能够短暂的出现在屏幕的某个位置,显示提示消息. 默认的位置是屏幕的下方正中,一般Toast的使用如下: Toas ...

  4. 在input中放对象

    var input = $("<input type='hidden' class='hidden-user'/>"); $(input).data("ran ...

  5. html JS 打开本地程序及文件

    在网页打开本地应用程序示例: 一.在本地注册表自定义协议:以自定义调用Viso为例 1.在HKEY_CLASSES_ROOT下添加项ZVISIO. 2.修改ZVISIO项下的"(默认)&qu ...

  6. TFS API:一、TFS 体系结构和概念

    TFS API:一.TFS  体系结构和概念 TFS是Team Fundation Server的简称,是微软VSTS的一部分,它是Microsoft应用程序生命周期管理(ALM)工具的核心协作平台, ...

  7. opencv2.4更换为opencv3.1后,mxnet编译错误(libpng16.so.16)

    编译显示错误为: /usr/bin/ld: warning: libpng16.so.16, needed by /usr/local/lib/libopencv_imgcodecs.so, not ...

  8. 【leetcode】ZigZag Conversion

    题目简述 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows ...

  9. UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包

    背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...

  10. Swift 基本常量和变量,基本数据类型

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #4dbf56 } p.p2 { margin: 0.0px 0. ...