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))来通知观察者事件发生。观察者实现类里对事件做出响应的业务逻辑处理。

  • 相关阅读:
    源码分析:①ReentrantLock之公平锁和非公平锁
    源码分析:同步基础框架——AbstractQueuedSynchronizer(AQS)
    java 同步锁:synchronized 关键字
    Java 中的锁优化
    Java 魔法类:Unsafe 解析
    实战:SpringBoot 2.3.0新特性之优雅停机
    实战:windows下使用docker部署springboot web demo项目
    版本控制SVN的使用笔记
    Maven项目管理:SpringMVC+Mybatis+Velocity整合笔记
    java常用集合总结
  • 原文地址:https://www.cnblogs.com/lyhero11/p/15587145.html
Copyright © 2011-2022 走看看