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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!