思想
类中持有一个观察者类对象集合,当类对象变化时能够通知并执行观察者对应方法;
描述
不涉及继承
其他
类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系
UML

示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| interface Source { public void name(); }
class Animal implements Source { @Override public void name(){ Test.printMsg("Animal.name"); }; } class Person implements Source { @Override public void name(){ Test.printMsg("Person.name"); }; }
interface Project { public void add(Source source); public void del(Source source); public void notifys(); public void operation(); }
abstract class Subject implements Project { private Vector<Source> vector = new Vector<Source>(); @Override public void add(Source observer) { vector.add(observer); } @Override public void del(Source observer) { vector.remove(observer); } @Override public void notifys() { Enumeration<Source> enumo = vector.elements(); while(enumo.hasMoreElements()){ enumo.nextElement().name(); } } }
class MySubject extends Subject { @Override public void operation(){ Test.printMsg("MySubject.operation"); notifys(); } }
public class Test { public static void printMsg(String msg){ System.out.println(msg); } public static void main(String[] args){ Project proj = new MySubject(); proj.add(new Animal()); proj.add(new Person()); proj.operation(); } }
|