zoukankan      html  css  js  c++  java
  • 观察者模式的简单例子

    Spring框架里边有很多Listener,对应的设计模式是观察者模式。所以写了一个小例子加深理解。
    一共3个类,被观察对象,观察者接口,观察者实现

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 被观察对象
     * */
    public class Subject {
    	private int state;
    	
    	private List<Listener> listeners; //被观察对象持有观察者的引用
    
    	public int getState() {
    		return state;
    	}
    
    	public void setState(int state) {
    		this.state = state;
    		notifyAllListeners();
    	}
    	
    	public void addListener(Listener listener) {
    		if(null == listeners)
    			listeners = new ArrayList<>();
    		listeners.add(listener);
    	}
    	
    	//通知观察者发生了事件
    	public void notifyAllListeners() {
    		for(Listener listener : listeners) {
    			listener.update(this);
    		}
    	}
    	
    	public static void main(String[] args) {
    		Subject subject = new Subject();
    		Listener listener1 = new ListenerImpl();
    		subject.addListener(listener1);
    		subject.setState(1);
    		subject.setState(3);
    	}
    }
    
    

    观察者

    /**
     * listener监听器接口,也就是“观察者”
     * */
    public interface Listener {
    	public void update(Subject subject);
    }
    
    /**
     * listener实现
     * */
    public class ListenerImpl implements Listener{
    
    	@Override
    	public void update(Subject subject) {
    		System.out.println(this.getClass().getName() + "监听到Subject变化事件, Subject state = " + subject.getState());
    		
    	}
    
    }
    

    运行结果:

    com.wangan.observer.ListenerImpl监听到Subject变化事件, Subject state = 1
    com.wangan.observer.ListenerImpl监听到Subject变化事件, Subject state = 3
    

    简单说明:通常被观察对象需要持有它的观察者的引用,然后当对象的某些事件发生的时候(例子中是setState()),通过调用观察者开放出来的接口方法(例子中的Listener.update(subject))来通知观察者事件发生。观察者实现类里对事件做出响应的业务逻辑处理。

  • 相关阅读:
    雨林木风操作系统有感
    Bitcoin P2P 虚拟货币原理详解
    SVN switch 用法详解
    Bitcoin P2P 货币:有史以来最危险的项目
    回旋线科普
    Mathematica 如何绘制双纵坐标轴的图像?
    c#数据库操作
    在自定义HttpHandler中无法使用Session
    VS2010安装因net framework4.0无法安装而失败的解决方法
    .net framework 4.0 0xc8000247错误解决
  • 原文地址:https://www.cnblogs.com/lyhero11/p/15587145.html
Copyright © 2011-2022 走看看