zoukankan      html  css  js  c++  java
  • 事件通知模板

    事件通知与观察者模式类似,参照《Java软件体系结构设计模式标准指南》P258,代码https://github.com/birdstudiocn/design-patterns-example/tree/master/src/38

    事件接口

    public interface Listener<T, S> {
    	void listen(T event, S result);
    }
    

    事件容器类

    public class OrderedComposite<S> {
    
    	private List<S> unordered = new ArrayList<S>();
    
    	private List<S> ordered = new ArrayList<S>();
    
    	private Comparator<? super S> comparator = new AnnotationAwareOrderComparator();
    
    	private List<S> list = new ArrayList<S>();
    
    	/**
    	 * Public setter for the listeners.
    	 * 
    	 * @param items
    	 */
    	public void setItems(List<? extends S> items) {
    		unordered.clear();
    		ordered.clear();
    		for (S s : items) {
    			add(s);
    		}
    	}
    
    	/**
    	 * Register additional item.
    	 * 
    	 * @param item
    	 */
    	public void add(S item) {
    		if (item instanceof Ordered) {
    			if (!ordered.contains(item)) {
    				ordered.add(item);
    			}
    		} else if (AnnotationUtils.isAnnotationDeclaredLocally(Order.class, item.getClass())) {
    			if (!ordered.contains(item)) {
    				ordered.add(item);
    			}
    		} else if (!unordered.contains(item)) {
    			unordered.add(item);
    		}
    		Collections.sort(ordered, comparator);
    		list.clear();
    		list.addAll(ordered);
    		list.addAll(unordered);
    	}
    
    	/**
    	 * Public getter for the list of items. The {@link Ordered} items come
    	 * first, followed by any unordered ones.
    	 * 
    	 * @return an iterator over the list of items
    	 */
    	public Iterator<S> iterator() {
    		return new ArrayList<S>(list).iterator();
    	}
    
    	/**
    	 * Public getter for the list of items in reverse. The {@link Ordered} items
    	 * come last, after any unordered ones.
    	 * 
    	 * @return an iterator over the list of items
    	 */
    	public Iterator<S> reverse() {
    		ArrayList<S> result = new ArrayList<S>(list);
    		Collections.reverse(result);
    		return result.iterator();
    	}
    
    }
    

    事件注册类

    public class CompositeListener<T, S> implements Listener<T, S> {
    
    	private OrderedComposite<ProcessListener<? super T, ? super S>> listeners = new OrderedComposite<ProcessListener<? super T, ? super S>>();
    
    	/**
    	 * Public setter for the listeners.
    	 *
    	 * @param itemReadListeners
    	 */
    	public void setListeners(List<? extends Listener<? super T, ? super S>> listeners) {
    		this.listeners.setItems(listeners);
    	}
    
    	/**
    	 * Register additional listener.
    	 *
    	 * @param itemReaderListener
    	 */
    	public void register(ProcessListener<? super T, ? super S> listener) {
    		listeners.add(listener);
    	}
    
    	/**
    	 * Call the registered listeners in reverse order, respecting and
    	 * prioritising those that implement {@link Ordered}.
    	 * 
    	 * @see org.springframework.batch.core.ProcessListener#afterProcess(java.lang.Object,
    	 *      java.lang.Object)
    	 */
    	@Override
    	public void listen(T item, S result) {
    		for (Iterator<Listener<? super T, ? super S>> iterator = listeners.reverse(); iterator.hasNext();) {
    		        Listener<? super T, ? super S> listener = iterator.next();
    			listener.listen(item, result);
    		}
    	}
    }
    

    事件目标实现类,Observable

    public class ConcreteListenSubject {
    	private CompositeListener<BaseEvent<VO, ResultVO>, BaseResult> listener = new CompositeListener<BaseEvent<VO, ResultVO>, BaseResult>();
    
    	public void registerListener(
    			ProcessListener<BaseProcessEvent<VO, ResultVO>, BaseResult> listener) {
    		this.listener.register(listener);
    	}
    
    	public ResultVO process(VO vo) throws Exception {
    		BaseEvent<VO, ResultVO> event = new BaseEvent<VO, ResultVO>(vo,resultVO);
    		listener.afterProcess(event, result);
    		return resultVO;
    	}
    }
    

    事件观察实现,Observer

    ConcreteListenSubject subject=new ConcreteListenSubject ();
    subject.registerListener(new Listener() {
        @Override
        public void listen(Object event, Object result) {
    	// TODO Auto-generated method stub			
       }
    });
    
  • 相关阅读:
    显示文件本地文件夹
    Select Dependencies选择依赖项
    搜索小技巧
    783. Minimum Distance Between BST Nodes BST节点之间的最小距离
    5. Longest Palindromic Substring 最长的回文子串
    12. Integer to Roman 整数转罗马数字
    3. Longest Substring Without Repeating Characters 最长的子串不重复字符
    539. Minimum Time Difference 最小时差
    43. Multiply Strings 字符串相乘
    445. Add Two Numbers II 两个数字相加2
  • 原文地址:https://www.cnblogs.com/birdstudio/p/7477522.html
Copyright © 2011-2022 走看看