观察者模式(Obeserver Pattern)也叫作发布订阅模式(Publish/subscribe),在项目中经常会见到该模式。
观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。
在观察者模式中有几个角色名称:
1.Subject被观察者
定义被观察者必须实现的职责,它必须能够动态的增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。
2.Observer观察者
观察者收到消息后,即进行update操作,对收到的消息进行处理。
3.ConcreteSubject具体的被观察者
定义被观察者自己的业务逻辑,同事定义对哪些事件进行通知。
4.ConcreteObserver具体的观察者
每个观察者在接收到消息后的处理反应是不同,各个观察者都有自己的处理逻辑
下面我们来看一下简单的通用代码:
被观察者抽象类
public abstract class Subject {
//定义一个观察者集合
private Vector<Observer> observers = new Vector<Observer>();
//增加一个观察者
public void addObserver(Observer observer) {
this.observers.add(observer);
}
//删除一个观察者
public void delObserver(Observer observer) {
this.observers.remove(observer);
}
//通知使用观察者
public void notifyObserver() {
for (Observer observer : observers) {
observer.update();
}
}
}
具体的被观察者
public class ConcreteSubject extends Subject {
//具体的业务
public void doSomeThing() {
System.out.println("被观察者开始做事");
this.notifyObserver();
}
}
观察者接口
public interface Observer {
//更新方法
void update();
}
具体的观察者
public class ConcreteObserver implements Observer {
//实现更新方法
public void update() {
System.out.println("观察者收到通知信息,并进行处理。。。。");
new Observable();
}
}
测试类:
public class Test {
public static void main(String[] args) {
//创建一个观察者
ConcreteObserver concreteObserver = new ConcreteObserver();
//创建一个被观察者
ConcreteSubject concreteSubject = new ConcreteSubject();
//添加进观察者集合
concreteSubject.addObserver(concreteObserver);
//被观察者开始活动
concreteSubject.doSomeThing();
}
}
执行结果如下:
被观察者开始做事
观察者收到通知信息,并进行处理。。。。