观察者模式与java委托

  • 所谓观察者模式,指的某个状态信息的改变,会影响其他一系列的操作,这时就可以将这些操作抽象化,同时创建一个类统一的管理和执行这些操作。把这些抽象出来的操作称为观察者类,而管理这些操作的类称为通知者类,通知者类维护着一个观察者类的集合,可以追加和删除观察者,同时可遍历通知所有观察者类执行操作。

     

  • 观察者模式的不足:虽然观察者模式提取出了抽象类,让类与类之间不互相依赖,共同依赖于抽象接口,这符合依赖倒转原则,但他们仍然依赖着抽象接口,而且有些时候不能提取出抽象的观察者(比如引用jar包)。
  • java委托机制与观察者模式:委托机制的实现不再需要提取观察者抽象类,观察者和通知者互不依赖。java利用反射即可实现,代码实例如下:

事件类

package com.suski.delegate;

import java.lang.reflect.Method;

public class Event {
private Object object; private String methodName; private Object[] params; private Class[] paramTypes; public Event(Object object,String method,Object...args)
{
this.object = object;
this.methodName = method;
this.params = args;
contractParamTypes(this.params);
} private void contractParamTypes(Object[] params)
{
this.paramTypes = new Class[params.length];
for (int i=0;i<params.length;i++)
{
this.paramTypes[i] = params[i].getClass();
}
} public void invoke() throws Exception
{
Method method = object.getClass().getMethod(this.methodName, this.paramTypes);//判断是否存在这个函数
if (null == method)
{
return;
}
method.invoke(this.object, this.params);//利用反射机制调用函数
}
}

事件管理类

package com.suski.delegate;

import java.util.ArrayList;
import java.util.List; public class EventHandler { private List<Event> objects; public EventHandler()
{
objects = new ArrayList<Event>();
} public void addEvent(Object object, String methodName, Object...args)
{
objects.add(new Event(object, methodName, args));
} public void notifyX() throws Exception
{
for (Event event : objects)
{
event.invoke();
}
}
}

通知者抽象类

package com.suski.delegate;

public abstract class Notifier {
private EventHandler eventHandler = new EventHandler(); public EventHandler getEventHandler()
{
return eventHandler;
} public void setEventHandler(EventHandler eventHandler)
{
this.eventHandler = eventHandler;
} public abstract void addListener(Object object,String methodName, Object...args); public abstract void notifyX(); }

通知者具体实现类

package com.suski.delegate;

public class ConcreteNotifier extends Notifier{

    @Override
public void addListener(Object object, String methodName, Object... args) {
this.getEventHandler().addEvent(object, methodName, args);
} @Override
public void notifyX() {
try {
this.getEventHandler().notifyX();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}

具体的观察者类,不再需要抽象观察者

package com.suski.delegate;

import java.util.Date;

public class WatchingTVListener {

    public WatchingTVListener()
{
System.out.println("watching TV");
} public void stopWatchingTV(Date date)
{
System.out.println("stop watching" + date);
}
} package com.suski.delegate; import java.util.Date; public class PlayingGameListener {
public PlayingGameListener()
{
System.out.println("playing");
} public void stopPlayingGame(Date date)
{
System.out.println("stop playing" + date);
}
}

测试方法

package com.suski.delegate;

import java.util.Date;

public class Test {

    public static void main (String[] args)
{
Notifier goodNotifier = new ConcreteNotifier(); PlayingGameListener playingGameListener = new PlayingGameListener(); WatchingTVListener watchingTVListener = new WatchingTVListener(); goodNotifier.addListener(playingGameListener, "stopPlayingGame", new Date()); goodNotifier.addListener(watchingTVListener, "stopWatchingTV", new Date()); goodNotifier.notifyX();
} }

观察者模式和java委托的更多相关文章

  1. 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  2. C#学习笔记(十七):委托、事件、观察者模式、匿名委托和lambert表达式

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. java委托

    上文讲过观察者模式,尽管已经用了依赖倒转原则,但是"抽象通知者"还是依赖"抽象观察者",也就是说万一没有了抽象观察者这样的接口,通知的功能就完不成了.另一方面, ...

  4. 新手码农浅谈观察者模式(java语言简单实现)

    一:什么是观察者模式: 官方定义:定义对象间一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 举个例子,很多人都会订阅天气预报,当气象台获得明天的天气情况( ...

  5. 观察者模式及Java实现例子

    http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html 观察者模式 观察者模式 Observer 观察者模式定义了一种一对多的依赖关 ...

  6. 设计模式之观察者模式(Java)

    设计模式(Design pattern)是什么?它是一套由四人组(The Gang of Four, [1]的作者)总结出来的软件设计框架.其目的是为了提高代码的可重用性,增强系统的可维护性和代码的易 ...

  7. JAVA委托事件处理机制

    1)事件:用户对程序的某一种功能性操作. Java中的事件主要有两种: 1.组件类事件 componentEvent.ContainerEvent.WindowEvent.FocusEvent.Pai ...

  8. 转:java 委托

    委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式 ...

  9. C# ~ 从 委托事件 到 观察者模式 - Observer

    委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...

随机推荐

  1. 洛谷U14200 Changing 题解 【杨辉三角】

    题目描述 有nnn盏灯环形排列,顺时针依次标号为1⋯n1\cdots n1⋯n.初始时刻为000,初始时刻第iii盏灯的亮灭aia_iai​给定,000表示灭,111表示亮.下一时刻每盏灯的亮灭取决于 ...

  2. PID控制算法的C语言实现三 位置型PID的C语言实现

    上一节中已经抽象出了位置性PID和增量型PID的数学表达式,这一节,重点讲解C语言代码的实现过程,算法的C语言实现过程具有一般性,通过PID算法的C语言实现,可以以此类推,设计其它算法的C语言实现. ...

  3. (转)iOS开发——来改掉那些被禁用的方法吧(持续更新中)

    iOS平台在快速的发展,各种接口正在不断的更新.随着iOS9的发布,又有一批老方法不推荐使用了,你若调用这些方法,运行的结果是没有问题的,但是会出现警告“***is deprecated :first ...

  4. Codeforces Round #417 (Div. 2)A B C E 模拟 枚举 二分 阶梯博弈

    A. Sagheer and Crossroads time limit per test 1 second memory limit per test 256 megabytes input sta ...

  5. poj1284 Primitive Roots

    Primitive Roots Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4775   Accepted: 2827 D ...

  6. 8.Android_UiAutomator 报告查看

    一.Android UiAutomator报告查看 1.错误类型 1)断言错误:就是断言这个用例的成功或者失败(AssrtionFailedError) 2)脚本错误:UiObjectNotFound ...

  7. 「PLC」PLC基本编程

    PLC中无非就是三大量:开关量(数字量).模拟量.脉冲量.只在搞清楚三者之间的关系,你就能熟练的掌握PLC了. PLC编程算法(一) 1. 开关量也称逻辑量,指仅有两个取值,0或1.ON或OFF.它是 ...

  8. 调整的R方_如何选择回归模型

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...

  9. 前端PHP入门-024-字符串函数-API查看

    数组.字符串和数据库是我们函数里面最.最.最常用的三类函数,数组和数据库我们现在还没有讲到,等讲到的时候我们再来和大家细说. 当然PHP的字符串函数也有很多.我们最常使用的两个系列的字符串: 单字节字 ...

  10. [DeeplearningAI笔记]卷积神经网络2.2经典网络

    4.2深度卷积网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 [LeNet]--Lécun Y, Bottou L, Bengio Y, et al. Gradient-bas ...