观察者模式:observer
2018-10-22 本文已影响13人
lconcise
观察者模式中有主题(Subject)和观察者(Observer),它定义了对象之间的一对多的依赖关系,当主题状态发生变化时,所有观察者都会收到通知并且自动更新。
简单来说,它类似于邮件订阅,当我们订阅了该文章,如果后续有更新,会及时通知你。
示例代码:
/**
* 观察者.
*/
public interface Observer {
void update();
}
/**
* 观察者实现类 Observer01.
*/
public class Observer01 implements Observer{
@Override
public void update() {
System.out.println("Observer01 has received");
}
}
/**
* 观察者实现类 Observer02.
*/
public class Observer02 implements Observer{
@Override
public void update() {
System.out.print("Observer02 has received");
}
}
/**
* 主题(被观察者).
*/
public interface Subject {
/**
* 增加观察者.
*
* @param observer 观察者.
*/
void add(Observer observer);
/**
* 删除观察者.
*
* @param observer 观察者
*/
void delete(Observer observer);
/**
* 通知所有观察者.
*/
void notifyToAll();
/**
* 自身的操作.
*/
void operation();
}
/**
* 主题(被观察者).
*/
public abstract class AbstractSubject implements Subject {
/**
* 存储观察者.
*/
private Vector<Observer> vector = new Vector();
@Override
public void add(Observer observer) {
vector.add(observer);
}
@Override
public void delete(Observer observer) {
vector.remove(observer);
}
@Override
public void notifyToAll() {
Enumeration<Observer> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
enumeration.nextElement().update();
}
}
}
/**
* 主题(被观察者)实现类.
*/
public class MySubject extends AbstractSubject {
@Override
public void operation() {
System.out.println("subject do operation ");
// 通知所有观察者
notifyToAll();
}
}
测试:
public class ObserverTests {
public static void main(String[] args) {
// 创建 主题(被观察者)
Subject mySubject =new MySubject();
// 创建观察者
Observer observer01 = new Observer01();
Observer observer02 = new Observer02();
// 主题(被观察者) 与 观察者确立关系 (一对多)
mySubject.add(observer01);
mySubject.add(observer02);
mySubject.operation();
}
}
测试结果:
image.png