OpenJDK源码--观察者模式工具类

观察者模式应用场景:

                            消息订阅,变更提醒等。

观察者模式原理:

                被观察对象继承 Observable 类,观察者实现Observer接口。

                当被观察对象发生变化时(自定义变化),会调用Observable.notifyObservers();方法,

                该方法会调用观察者Observer.update();方法,从而实现联动操作。

代码实施注意点:

                (1): 被观察对象继承 Observable 类,观察者实现Observer接口

                 (2):一个被观察对象可以有多个观察者。

                (3):被观察者发生变化时先调用Observable.setChanged()方法设置是否变化状态。


示例代码:

        模拟新闻更新系统

package com.objServer1;

import java.util.Date;
import java.util.Observable;

/**
 * 设置被监控者对象
 * @author Administrator
 *
 */
public class newsInfo extends Observable{
	
	String info;
	String tatil;
	Date time ;
	String add ;
	
	
	void setChangeMode(newsInfo msg){
		//外层可以自定义变更条件
		setChanged();//设置变更状态
		newsInfo arg = new newsInfo();
		arg.setAdd(msg.getAdd());
		arg.setInfo(msg.getInfo());;
		arg.setTatil(msg.getTatil());;
		arg.setTime(msg.getTime());;
		notifyObservers(arg);//通知当前对象监控者信息发生变动
	}
	
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}
	public String getTatil() {
		return tatil;
	}
	public void setTatil(String tatil) {
		this.tatil = tatil;
	}
	public Date getTime() {
		return time;
	}
	public void setTime(Date time) {
		this.time = time;
	}
	public String getAdd() {
		return add;
	}
	public void setAdd(String add) {
		this.add = add;
	}
	
}
package com.objServer1;

import java.util.Observable;
import java.util.Observer;

public class newsChage implements Observer{

	//notifyObservers方法会调用Observer.update()方法;
	@Override
	public void update(Observable o, Object arg) {
		if(arg instanceof newsInfo){
			newsInfo ss = (newsInfo)arg;
			System.out.println("今天的新闻标题为:"+ss.getTatil());
			System.out.println("今天的新闻内容为:"+ss.getInfo());
			System.out.println("今天的新闻地址为:"+ss.getAdd());
			System.out.println("今天的新闻时间为:"+ss.getTime());
		}
	}
	
}
package com.objServer1;

import java.util.Date;

public class setNewsInfo{
	
	public static void main(String[] args) {
		newsInfo msg = new newsInfo();//被监控者
		newsChage observerER = new newsChage();//监控者
		msg.setAdd("大悦城");
		msg.setInfo("喜气洋洋过春节!");
		msg.setTatil("过年好!");
		msg.setTime(new Date());
		msg.addObserver(observerER);//将监控者加入被监控者的监控列表
		msg.setChangeMode(msg);//修改被监控者信息,触发监控效果
	}

}

运行结果:

今天的新闻标题为:过年好!
今天的新闻内容为:喜气洋洋过春节!
今天的新闻地址为:大悦城
今天的新闻时间为:Thu May 03 14:23:22 GMT+08:00 2018

以上!

参考文章:https://blog.csdn.net/fansunion/article/details/13089973(推荐该博主)

你可能感兴趣的:(学习过程)