观察者模式与事件委托

情景

  • 平时很多人都会用新浪微博, 关注女神动态, 女神就是通知者,也叫主题, 而关注女神的这些人,就是观察者,也叫订阅者, 既然订阅了女神的动态, 如果女神有新的动态, 我们就会想通过某一个渠道被通知, 这种交互方式就是观察者模式

常见的使用场景;

  • spring中的event, listener等都是观察者模式

代码实现

 /**
     * 通知者, 也是主题发布者, 就是为了被观察或者订阅的,
     * 主题如果状态发生改变,就会通知所有的订阅者(观察者)
     */
public interface Subject {
    void addFans(Observer fans);
    void deleteFans(Observer fans);
    void notifyFans();

    void addFansWithEventListener(Observer fans, String event);
    void statusChange();
}
  /**
     * 屌丝朋友们都爱关注的刘亦菲仙女
     */
public class LiuYiFei implements Subject {
    @Override
    public void addFans(Observer fans) {
        fansWithEventListener.put(fans, null);
    }

    @Override
    public void deleteFans(Observer fans){
        fansWithEventListener.remove(fans);
    }

    /**
     * 记录每个对象的回调事件
     * 模拟了 c# eventhandler liuyifei.update += zhangsan.getinfobyemail //大话设计模式 14
     */
    private Map<Observer, String> fansWithEventListener =  new HashMap<>();

    /**
     * 通知所有的粉丝儿, 面条儿....
     */
    @Override
    public void notifyFans() {
        for (Observer fans : fansWithEventListener.keySet()) {
            if(fansWithEventListener.get(fans) == null){
                //默认采用qq通知
                fans.getInfoByQQ();
            }else{
                //如果有自己注册的事件, 就采用指定的通知方式通知
                try {
                    fans.getClass().getDeclaredMethod(fansWithEventListener.get(fans)).invoke(fans) ;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void addFansWithEventListener(Observer fans, String event) {
        fansWithEventListener.put(fans, event);
    }

    /**
     * 女神的状态改变, 所有订阅者第一时间收到消息
     */
    @Override
    public void statusChange() {
        this.notifyFans();
    }
}
/**
     * 事件委托模型: 订阅的时候顺便制定通知的方式
     * 基础的观察者模式通知方式比较单一, 只能通过一条路径通知订阅者
     * 现在我们有微信, 有扣扣, 有邮箱, 我们需要自己指定通过什么渠道来订阅通知
     */
public interface Observer {

    //主题发生改变时的通知渠道
    void getInfoByQQ();

    //主题发生改变时使用微信通知
    void getInfoByWeiXin();

    //主题发生改变时使用邮件通知
    void getInfoByEMail();
}
public class ZhangSan implements Observer {
    @Override
    public void getInfoByQQ() {
        System.out.println("我是张三, QQ通知: 女神更新状态了!!");
    }

    @Override
    public void getInfoByWeiXin() {
        System.out.println("我是张三, 微信通知: 女神更新状态了!!");
    }

    @Override
    public void getInfoByEMail() {
        System.out.println("我是张三, 邮箱通知: 女神更新状态了!!");
    }
}
public class LiSi implements Observer {
    @Override
    public void getInfoByQQ() {
        System.out.println("我是李四,QQ通知: 女神更新状态了!!");
    }

    @Override
    public void getInfoByWeiXin() {
        System.out.println("我是李四,微信通知: 女神更新状态了!!");
    }

    @Override
    public void getInfoByEMail() {
        System.out.println("我是李四,邮箱通知: 女神更新状态了!!");
    }
}
/**
 * 王二麻子实现订阅接口就可以有获取新动态的能力
 */
public class WangerMaZi implements Observer {

    /**
     * 订阅了菲菲女神微博后, 女神发新状态通知王二麻子的渠道
     */
    @Override
    public void getInfoByQQ() {
        System.out.println("我是王二麻子, QQ通知: 女神更新状态了!!");
    }

    @Override
    public void getInfoByWeiXin() {
        System.out.println("我是王二麻子, 微信通知: 女神更新状态了!!");
    }

    @Override
    public void getInfoByEMail() {
        System.out.println("我是王二麻子, 邮箱通知: 女神更新状态了!!");
    }
}
public class TestEventHandler {
    /**
     * 女神刘亦菲更新微博状态后发生什么
     */
    @Test
    public void afterLiuyifeiUpdateWeibo(){
        Subject liuyifei = new LiuYiFei();

        Observer zhangSan = new ZhangSan();
        Observer liSi = new LiSi();
        Observer wangerMaZi = new WangerMaZi();

//        liuyifei.addListener(zhangSan, "微信通知");
//      liuyifei.addListener(lisiSan, "邮箱通知");
        //指定通知以后的回调方法
        liuyifei.addFansWithEventListener(zhangSan, "getInfoByWeiXin");
        liuyifei.addFansWithEventListener(wangerMaZi, "getInfoByEMail");
        liuyifei.addFans(liSi);

        liuyifei.statusChange();
    }
}

源码路径

https://github.com/offline7LY/designpattern/tree/master/observer

原文地址:https://www.cnblogs.com/qq347061329/p/8634397.html

时间: 2024-08-02 17:46:32

观察者模式与事件委托的相关文章

班主任来啦之观察者模式,事件委托等Java实现---如果你还不懂,看完此文,就一定会懂

班主任来啦! 小A对小B说:"今天真是笑死人了,我们班一位同学在仔细的时候看NBA球赛,被班主任抓了个正着.班主任脸都绿了,哈哈,真是笑死我了. 小B说:"啊,你们怎么同学怎么敢在课上看电视啊?" 小A说:"没有的,他们那帮子男生经常自习的时候看球赛的.我们班有个女生坐在前排,那些男生就给她送写小礼物啊什么的.班主任来了,那个女生就去通知敲一下桌子." 小B说:"好吧.这也行.那今天怎么会有人被抓?" 小A说:"这是因为刚好班

《大话设计模式》——读后感 (6)老板回来了,我不知道?——观察者模式之事件委托(2)

什么都不说,直接上代码,自己去理解,要结合动态代理看 Event: package com.sjmx.observer.application; import java.lang.reflect.Method; public class Event { private Object object; private String methodName; private Object[] params; private Class[] paramTypes; public Event(Object

【Unity3D技巧】在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在前面两篇文章: [Unity3D基础教程]给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D [Unity3D基础教程]给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation 我们了解

常用设计模式之观察者模式 + 事件委托

常用设计模式之观察者模式 + 事件委托 作用及UML (摘自<大话设计模式>) Code 1 abstract class Subject{ 2 protected String state; 3 public void setState(String state){this.state = state;} 4 public String getState(){return this.state;} 5 6 private List<Observer> observers = ne

利用事件委托弥补观察者模式不足

前两篇我们自己首先实现了一个观察者模式,我们再利用Java自带的接口和类实现了观察者模式,但其实两种观察者模式存在不足的地方.之前两种观察者模式的观察者(订阅者)都是实现了一个同一个接口,实现了接口中的update方法,但是如果两个观察者风马牛不相及,完全无关呢?或者他们的方法名不一样这个时候该怎么办呢?<大话设计模式>中C#提供了事件委托,但在Java中比没有提供.此时,我们可以利用Java的反射机制来实现事件委托从而来弥补观察者模式的不足. 我们先来看看客户端的测试代码,直观的感受一下和之

大话设计模式-观察者模式/事件委托

观察者模式 观察者模式又称发布-订阅模式,其定义了一种多对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能自动更新自己. 观察者模式的动机 将一个系统分割成一系列相互协作的类有一个很不好的副作用就是需要维护相关对象间的一致性. 我们不希望为了维持一致性而使各类紧密耦合,这样会给维护.扩展和重用都带来不便. 当一个对象的改变需要同时改变其他对象而且他不知道具体有多少对象有待改变时,就应该考虑使用观察者模式. 当一个抽象模型有两个方面

在Unity中使用事件/委托机制(event/delegate)进行GameObject之

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一对多的观察者模式机制有什么缺点? 如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:[Unity3D技巧]在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 在前一篇博客里面,我们写到

观察者设计模式 Vs 事件委托(java)

观察者设计模式 Vs 事件委托 转载请注明原博客地址: http://blog.csdn.net/gdutxiaoxu/article/details/51824769 源码下载地址: http://download.csdn.net/detail/gdutxiaoxu/9567209 本篇博客主要讲解一下几个问题 什么是观察者模式 观察者模式的优缺点 如何看待观察者模式的缺点 事件的委托 什么是观察者模式 简单来说,当有多个观察者想同时观察同一个主题对象的时候,当主题对象的 状态发生变化,观察

在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 引子 在前面两篇文章: 我们了解了2D中的Sprite,Animation,RigidBody和Collider,在继续开发游戏的过程中,我们会遇到这样的问题,如何处理GameObject之间的相互调用,比如说在FlappyBird中我们在小鸟撞倒管子的时候,要把这