zoukankan      html  css  js  c++  java
  • 设计模式之监听器模式

    事件处理模型:


    组件(事件源)不处理自己的事件,而是将事件处理托付给外部的处理实体(监听器,

    这样的事件处理模型称为事件的 授权处理模型。

    不同的事件,能够交由不同类型的监听器去处理


    事件源:


    提供订阅与取消监听者的方法,并负责维护监听者列表,发送事件给监听者


    监听者:


    每一个监听者实现接口来接收事件,并负责从事件源订阅与取消订阅



    图示:





    demo


    事件源:

    Context:


    package com.demo.event;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Context {
    	private static List<Listener> list=new ArrayList<Listener>();
    	public static void addListener(Listener listener){
    		list.add(listener);
    	}
    	public static void removeListener(Listener listener){
    		list.remove(listener);
    	}
    	public static void sendNotification(Event event){
    		for(Listener listener:list){
    			listener.onChange(event);
    		}
    	}
    }
    

    监听者:

    Listener

    package com.demo.event;
    
    public interface Listener {
    	public void onChange(Event event);
    }
    

    MyListener


    package com.demo.event;
    
    public class MyListener implements Listener {
    
    	@Override
    	public void onChange(Event event) {
    		switch(event.getType()){
    			case Event.INSTALLED:
    				System.out.println("do install...");
    				break;
    			case Event.STARTED :
    				System.out.println("do started...");
    				break;
    			case Event.RESOLVED :
    				System.out.println("do resolved...");
    				break;
    			case Event.STOPPED :
    				System.out.println("do stopped...");
    				break;
    			case Event.UNRESOLVED :
    				System.out.println("do unresolved...");
    				break;
    			case Event.UNINSTALLED :
    				System.out.println("do uninstalled...");
    				break;
    			default:
    				throw new IllegalArgumentException();
    		}
    	}
    
    }
    

    事件:

    package com.demo.event;
    
    public class Event {
    	public static final int INSTALLED =1; 
    	public static final int STARTED =2; 
    	public static final int RESOLVED  =3; 
    	public static final int STOPPED =4; 
    	public static final int UNRESOLVED  =5; 
    	public static final int UNINSTALLED   =6;
    	private int type ;
    	private Object source ;
    	public Event(int type, Object source) {
    		this.type = type;
    		this.source = source;
    	}
    	public int getType() {
    		return type;
    	}
    	public Object getSource() {
    		return source;
    	}
    }
    


    測试:

    package com.demo.event;
    
    public class EventTest {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		Listener listener=new MyListener();
    		//加入监听者
    		Context.addListener(listener);
    		//模拟bundle安装完毕事件触发
    		Context.sendNotification(new Event(Event.INSTALLED, new MyBundle()));
    	}
    
    }
    



  • 相关阅读:
    这是一个数学题牛客训练赛E
    最好使用%f输出浮点数据,acm
    hdu 1263 水果 结构的排序+sort自定义排序
    多校寒训TaoTao要吃鸡dp
    计算直角坐标系的面积并和面积交和周长并(可小数)
    Codeforces Round #620 (Div. 2)E LCA
    Codeforces Round #620 (Div. 2)D dilworld定理
    Codeforces Round #621 (Div. 1 + Div. 2)D dij(思维)
    poj2243 给出m个模式串,求长度小于n的且存在模式串的字符串数有多少个(a~z)(思维构造+ac自动机)
    poj2778 求构造长度为n的字符串不包含给定的m个字符串的个数(矩阵乘法+ac自动机)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4286667.html
Copyright © 2011-2022 走看看