本文章,摘抄自: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 }
结果: