使用观察者模式发布通知并获取执行结果

github地址

1、观察者

public interface Observer {
	// 声明响应方法
	public void update(Observable o, Object obj);
	
}

2、被观察者

public abstract class Observable {

	protected List<Observer> observers = new ArrayList<Observer>();
	
	protected void registObserver(Observer observer) {
		observers.add(observer);
	}
	
	protected void removeObserver(Observer observer) {
		observers.remove(observer);
	}
	
	protected void notifyObserver(Object object) {
		for (Observer observer : observers) {
			try {
				observer.update(this, object);
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("###Observable##nofithObserver#发布通知{},事件执行失败{}" + JSONObject.toJSONString(object));
			}
		}
	}
}

3、通知事件

public class ObserverUtil {

	private static Observable observable;
	private static ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());
	
	// 初始化监听器
	static {
		ObserverUtil.observable = new ObserverUtil.CachedObservable();
		observable.registObserver(new JobOne());
		observable.registObserver(new JobTwo());
	}
	
	public static void notifyObservers(final Object obj){
		schedulePool.execute(new Runnable() {
			public void run() {
				try{
					observable.notifyObserver(obj);
				}catch(Exception e){
					System.out.println("###ObserverUtil##notifyObservers#程池发布通知事件执行失败  信息:{}" + e.getMessage());
				}
			}
		});
	}
	
	private static class CachedObservable extends Observable {
		
	}
	
}

4、工作Job和常量类

public class JobOne implements Observer {

	public void update(Observable o, Object obj) {
		if(obj instanceof Map) {
			if (((Map) obj).get("key").equals("JobOne")) {
				System.out.println("###JobOne##JobOne开始执行:" + ((Map) obj).get("key"));
				Common.jobOne = true;
			}
		}
	}

}

public class JobTwo implements Observer {

	public void update(Observable o, Object obj) {
		if (obj instanceof Map) {
			if (((Map) obj).get("key").equals("JobTwo")) {
				System.out.println("###JobTwo##JobTwo开始执行:" + ((Map) obj).get("key"));
				Common.jobTwo = true;
			}
		}
	}

}

public class Common {
	
	public static Boolean jobOne = false;
	public static Boolean jobTwo = false;
	
}

5、测试

public class Test {

	public static void main(String[] args) {
		System.out.println("jobOne:" + Common.jobOne + "-----jobTwo:" + Common.jobTwo);
		Map<String,Object> mapOne = new HashMap<String, Object>();
		mapOne.put("key", "JobOne");
		mapOne.put("value",  "JobOne执行");
		ObserverUtil.notifyObservers(mapOne);
		Map<String,Object> mapTwo = new HashMap<String, Object>();
		mapTwo.put("key", "JobTwo");
		mapTwo.put("value",  "JobTwo执行");
		ObserverUtil.notifyObservers(mapTwo);
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("jobOne:" + Common.jobOne + "-----jobTwo:" + Common.jobTwo);
	}
	
}

6、运行结果

jobOne:false-----jobTwo:false
###JobOne##JobOne开始执行:JobOne
###JobTwo##JobTwo开始执行:JobTwo
jobOne:true-----jobTwo:true

猜你喜欢

转载自blog.csdn.net/qq_27243963/article/details/90747379
今日推荐