java设计模式之观察者模式

定义

定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。
通过定义简单的可以理解为mq里面的主题模式,当主题一变化的时候,会向订阅他的消费者推送主题的信息,这样达到交互对象之间的松耦合,代码也能很好的进行对应的复用的操作。

涉及到的设计原则

原则1:为了交互对象之间的松耦合设计

具体的实现过程

主题接口

/**
 * 
 * @author 永恒日落
 *	主题接口
 *	相当于一个注册中心,提供观察者注册与取消注册的服务
 */
public interface Subject {
	//将对应的观察者注册到主题里面,建立关联
	public void registerObserver(Observer o);
	//将对应的观察者从主题里面剔除出去
	public void removeObserver(Observer o);
	//一旦主题进行对应的内容变化的时候,及时通知观察者
	public void notifyObserver();
}

观察者接口

/**
 * 
 * @author 永恒日落
 *	观察者接口
 */
public interface Observer {
	//接受到主题传输过来的数据,进行各自观察者对应的数据处理操作
	public void update(String msg,int id);
}

主题的具体实现类

/**
 * 
 * @author 永恒日落
 *	新的数据插入或者数据变更,需要通知前后端数据的同步操作
 */
public class DataSubject implements Subject{
	//在这里进行观察者的记录,这里采用简单的list的集合,可做适当的调整
	private ArrayList<Observer> observers;
	//对应的需要更新的数据
	private String msg;
	//对应的更新数据的id
	private int id;

	public DataSubject() {
		super();
		//初始化操作
		observers = new ArrayList<Observer>();
	}

	@Override
	public void registerObserver(Observer o) {
		// 注册到对应的主题里面去
		observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		// 取消观察者和主题之间的联系
		int i = observers.indexOf(o);
		if(i>0) {
			observers.remove(i);
		}
	}

	@Override
	public void notifyObserver() {
		// 遍历所有的观察者,并调用数据处理的方法
		for (int i = 0; i < observers.size(); i++) {
			Observer observer = observers.get(i);
			//调取各个观察者对应的数据处理的方法
			observer.update(msg, id);
		}
	}
	
	public void dataChanged() {
		
		notifyObserver();
	}

	public void setDatas(String msg, int id) {
		
		this.msg=msg;
		this.id=id;
		dataChanged();
	}
}

观察者的具体的实现类

/**
 * 
 * @author 永恒日落
 *
 */
public class WebDataUpdata implements Observer{
	
	private String msg;
	
	private int id;
	//放入对应的subject主题的引用
	private Subject dataSubject;

	public WebDataUpdata(Subject dataSubject) {
		super();
		//实例化操作
		this.dataSubject=dataSubject;
		//调用注册,和主题进行对应的关联操作
		dataSubject.registerObserver(this);
	}

	@Override
	public void update(String msg, int id) {
		// TODO Auto-generated method stub
		this.msg=msg;
		this.id=id;
		//具体的数据处理操作,各自实现
		display();
		
	}

	public void display() {
		System.out.println("前端数据更新完成");
	}
}

观察者模式的一些总结

  1. 上面的观察者模式属于主题向各个观察者推送数据,在测试过程中,一旦主题数据有变化,可以直接推送到各个观察者里面,并执行对应的数据处理的操作,但在实际的操作过程中,如果主题的数据变化很频繁,所有的观察者都需要进行对应的数据处理的操作,这时可以采取手动获取主题里面的数据,只需做相关大代码改动即可;
  2. 这里暂时的理解,观察者的模式类似于我们常用的mq的主题策略;
  3. 主题和观察者我们这里采用的都是接口的操作,主题里面的依赖的是观察者的接口,这样不需要关注具体的实现,实现了主题和具体观察者之间的松耦合。
发布了6 篇原创文章 · 获赞 1 · 访问量 291
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览