2 sun13rain14 sun13rain14 于 2013.09.16 16:01 提问

高手快来啊,关于方法级别的事件订阅

大家好,现在有这么一个需求,请教一下有没有好的实现办法。

需求描述:
  1、ClassA产生事件,可能有多种类型,例如:订单创建、订单付款、订单评价。。。等。

  2、有许多类需要知道ClassA产生的事件中的一种或多种类型。例如:ClassB想知道ClassA产生的订单创建、订单评价这两个事件。

  3、应该怎么实现?我现在的做法是:

Class A {

     List<ClassAListener> listeners = new ArrayList<>();  

    void produceEvent(String a){
      if(a == 订单创建){
          foreach(listeners as l){
          l.onCreated();
      }else if(a == 订单付款){
          foreach(listeners as l){
         l.onPay();
     }
 }
 }
 }  
 }

然后让ClassB继续ClassAListener,重写onCreated、onPay等方法。

描述的可能不太清楚,大家都是高手应该可能看懂我的意思,有问题请留言。

谢谢大家了。

1个回答

asiaasia666
asiaasia666   2013.09.16 23:25
已采纳
import java.util.*;
public class  A 
{
    //全部监听
    private Map<String, List<ListenerClassA>> listenerMap = new HashMap<String, List<ListenerClassA>>();

    //添加
    public void addListener(String action, ListenerClassA lisenter){
        if(lisenter==null){
            return;
        }
        List<ListenerClassA> listeners = listenerMap.get(action);
        if(listeners==null){
            listeners = new ArrayList<ListenerClassA>();
            listenerMap.put(action, listeners);
        }

        listeners.add(lisenter);
    }

    //发布事件
    public void produceEvent(String action){
        List<ListenerClassA> listeners = listenerMap.get(action);
        if(listeners==null){
            return;
        }
        for(ListenerClassA lisenter : listeners ){
            lisenter.execute(this);
        }
    }


}

//监听者
interface ListenerClassA
{
    public void execute(A a);
}

Class A产生事件,可能有多种类型,例如:订单创建、订单付款、订单评价。。。等。
将这些内容做成全局静态变量字符串或者枚举类,会更加好些。


以上是我想到的实现方式。仅供参考

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
EventBus优化发布订阅事件详解
一、概述 EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。 1、下载EventBus的类库 源码:https://github.com/greenrobot/EventBus 2、
事件的订阅与处理
1. 订阅者只需在构造函数里带上含有事件处理的类,并订阅,写上自己的事件处理程序 2. 含有事件的类,里面有方法,用来提供给程序的其它部分调用,这个方法里有激活事件的程序,在程序激活事件之前需判断订阅者是否为空,而这个程序一般命名为OnRaiseCustomEvent(CustomEventArgs e) 3. 委托函数和事件的声明, 首字母都是大写 public class Cus
在事件发布端移除所有事件订阅
如何在事件发布端取消所有事件订阅?
SpringMVC是方法级别的测试
SpringMVC是方法级别的测试 在SpringMVC和Struts2的区别一文中提到,springMVC是方法级别的拦截,这篇文章将已实际案例来测试springMVC是方法级别的拦截。如有理解的不对的地方,欢迎指教。 package com.qxl.framework.web.controller.test; import org.springframework.stereoty
C#事件的订阅与触发
C#有关事件的使用-进阶版
LogCat5个级别的作用
在看了郭林大哥的《第一行代码》后,知道了LogCat原来是这么用的:       在 LogCat中可以根据更换级别来在logCat中显示不同级别的打印信息!其中Log.e的级别是最高的,打印出来的颜色是红色的,    当我们需要在大量的打印信息中找出自己需要的答应信息,可以用Log.e()打印,然候在LogCat中更换级别为error级别,在LogCat    中就只会显示error级别的
方法级别的泛型
public List getAll(Class entityClass);
一个事件被多次订阅
一个事件被多个函数给订阅,将会
Unity教程之-Unity3d中基于订阅者模式实现事件机制
我们知道通过在Unity3D中通过GetComponent就可以获得某个模块的实例,进而引用这个实例完成相关任务的调用。可是显然这种方法,就像我们随身带着现金去和不同的人进行交易,每次交易的时候都需要我们考虑现金的支入和支出问题,从安全性和耦合度两个方面进行考虑,这种方法在面对复杂的系统设计的时候,非常容易造成模块间的相互依赖,即会增加不同模块间的耦合度。为了解决这个问题,大家开始考虑单例模式,因为
CMM/CMMI从低到高各级别与对应不同组织层次关系的理解
从整体来看CMMI的各个级别,你会发现它不同级别关注的层次在发生变化,从无到有的最开始级,主要是依赖于个人主义,到了2级它主要是关注项目管理,也就是目标主要针对项目,帮助你建立起项目管理的框架。而到了3级的时候他主要关注的是组织级,也就是公司级,在公司级建立起持续改进的框架,让组织级规范起来,到了4级,其实他又回到了项目级,因为在3级的时候为公司积累了大量的过程资产,经过分析整理后,应该用回到项目