sun13rain14 2013-09-16 08:01 采纳率: 50%
浏览 2044
已采纳

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

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

需求描述:
  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条回答

  • 马欢欢 2013-09-16 15: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产生事件,可能有多种类型,例如:订单创建、订单付款、订单评价。。。等。
    将这些内容做成全局静态变量字符串或者枚举类,会更加好些。


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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题