观察者模式和java委托
观察者模式与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委托的更多相关文章
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
		在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ... 
- C#学习笔记(十七):委托、事件、观察者模式、匿名委托和lambert表达式
		using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ... 
- java委托
		上文讲过观察者模式,尽管已经用了依赖倒转原则,但是"抽象通知者"还是依赖"抽象观察者",也就是说万一没有了抽象观察者这样的接口,通知的功能就完不成了.另一方面, ... 
- 新手码农浅谈观察者模式(java语言简单实现)
		一:什么是观察者模式: 官方定义:定义对象间一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 举个例子,很多人都会订阅天气预报,当气象台获得明天的天气情况( ... 
- 观察者模式及Java实现例子
		http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html 观察者模式 观察者模式 Observer 观察者模式定义了一种一对多的依赖关 ... 
- 设计模式之观察者模式(Java)
		设计模式(Design pattern)是什么?它是一套由四人组(The Gang of Four, [1]的作者)总结出来的软件设计框架.其目的是为了提高代码的可重用性,增强系统的可维护性和代码的易 ... 
- JAVA委托事件处理机制
		1)事件:用户对程序的某一种功能性操作. Java中的事件主要有两种: 1.组件类事件 componentEvent.ContainerEvent.WindowEvent.FocusEvent.Pai ... 
- 转:java  委托
		委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式 ... 
- C# ~ 从 委托事件 到 观察者模式 - Observer
		委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ... 
随机推荐
- ZJOI 2017 二试 day0
			2017.4.25 话说4.24怒订正了6题,早上大扫除,把校服弄脏了too sad 中午从二中出发,只2个小时不到就抵达宾馆,开始先在大厅等候了半天(分配房间),和一试差不多.只是这个宾馆要远优于“ ... 
- [CEOI2004]锯木厂选址
			link 试题分析 做这种题就应该去先写个暴力代码 #include<iostream> #include<cstring> #include<cstdio> #i ... 
- 【51nod1965】奇怪的式子
			Portal --> 51nod1965 Solution 怎么说呢..这题..做的有点痛苦.. 首先看这个式子长得..比较奇怪,指数里面那个加号有点烦人,而且这个函数不是一个积性函数也有点烦人 ... 
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
			一.什么是继承 继承是一种创建新的类的方式,在pyth ... 
- Codeforces Global Round 2 题解
			Codeforces Global Round 2 题目链接:https://codeforces.com/contest/1119 A. Ilya and a Colorful Walk 题意: 给 ... 
- Tests for normality正态分布检验
			欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/ ... 
- Splay 区间操作
			据大佬说,\(Splay\)是序列操作之王.\(Splay\)是一种平衡树,通过伸展(\(Splay\)),在不改变中序遍历的前提下变换根的位置,从而快速的进行序列操作 \(Splay\)最常见的序列 ... 
- Java的三大特性之封装
			java提高篇(一)-----理解java的三大特性之封装 三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一 ... 
- CodeBlocks的常用快捷键
			CodeBlocks常用操作快捷键 编辑部分: Ctrl + A:全选 Ctrl + C:复制 Ctrl + X: 剪切 Ctrl + V:粘贴 Ctrl + Z:撤销 Ctrl + S:保存 Ctr ... 
- HDU   2159     FATE      (dp)
			题目链接 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最 ... 
