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("前端数据更新完成");
}
}
观察者模式的一些总结
- 上面的观察者模式属于主题向各个观察者推送数据,在测试过程中,一旦主题数据有变化,可以直接推送到各个观察者里面,并执行对应的数据处理的操作,但在实际的操作过程中,如果主题的数据变化很频繁,所有的观察者都需要进行对应的数据处理的操作,这时可以采取手动获取主题里面的数据,只需做相关大代码改动即可;
- 这里暂时的理解,观察者的模式类似于我们常用的mq的主题策略;
- 主题和观察者我们这里采用的都是接口的操作,主题里面的依赖的是观察者的接口,这样不需要关注具体的实现,实现了主题和具体观察者之间的松耦合。