观察者模式

本文章,摘抄自:2018黑马程序最新面试题汇总

观察者模式很好理解,类似于邮件订阅和 RSS 订阅,当我们浏览一些博客或 wiki 时,经常会看到 RSS 图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。

其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。

 1 public interface IObserver {
 2     public void update();
 3 }
 4 
 5 public class Observer1 implements IObserver {
 6 
 7     @Override
 8     public void update() {
 9         System.out.println("observer1 has received!");
10 
11     }
12 }
13 
14 public class Observer2 implements IObserver {
15 
16     @Override
17     public void update() {
18         System.out.println("observer2 has received!");
19 
20     }
21 }
 1 public interface ISubject {
 2 
 3     /**
 4      * 增加观察者
 5      */
 6     public void add(IObserver observer);
 7 
 8     /**
 9      * 删除观察者
10      */
11     public void del(IObserver observer);
12 
13     /**
14      * 通知所有的观察者
15      */
16     public void notifyObservers();
17 
18     /**
19      * 自身的操作
20      */
21     public void operation();
22 }
 1 import java.util.Enumeration;
 2 import java.util.Vector;
 3 
 4 public abstract class AbstractSubject implements ISubject {
 5     private Vector<IObserver> vector = new Vector<>();
 6 
 7     @Override
 8     public void add(IObserver observer) {
 9         vector.add(observer);
10     }
11 
12     @Override
13     public void del(IObserver observer) {
14         vector.remove(observer);
15     }
16 
17     @Override
18     public void notifyObservers() {
19         Enumeration<IObserver> enumo = vector.elements();
20         while (enumo.hasMoreElements()) {
21             enumo.nextElement().update();
22 
23         }
24     }
25 }
 1 public class MySubject extends AbstractSubject {
 2 
 3     @Override
 4     public void operation() {
 5         System.out.println("update self!");
 6         notifyObservers();
 7 
 8     }
 9 
10 }

测试方法:

1 @Test
2     public void test() {
3         ISubject subject = new MySubject();
4         subject.add(new Observer1());
5         subject.add(new Observer2());
6         subject.operation();
7     }

结果:

原文地址:https://www.cnblogs.com/ffeiyang/p/9542825.html