1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 2) 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 3) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。 其实观察者模式同前面讲过的桥梁、策略有着共同的使用环境:将变化独立封装起来,以达到最大的重用和解耦。观察者与后两者不同的地方在于,观察者模式中的目标和观察者的变化不是独立的,而是有着某些联系。
典型用例:hibernate
下面通过一个例子来说明: public class Account { private int state; private String name; public String getName() { return name; } public Account(String name) { super(); this.name = name; } public int getState() { return state; } public void setState(int state) { this.state = state; } @Override public String toString() { return name; } } public class AccountManager { public void sendEmail(Account account) { System.out.println('send Email:' account); } } 来看一下java代码是如何实现观察者模式的 public interface Observer { public void update(Subject subject); } public interface Subject { public void addObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); }
public class AccountManager implements Observer { public void update(Subject subject) { sendEmail((Account) subject); } } 跟踪和通知观察者 private Set observers = new HashSet(); public void addObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { observers.remove(o); } public void notifyObservers() { for (Observer o : observers) { o.update(this); } }
Account
public void setState(int state) { if (this.state != state) { this.state = state; notifyObservers(); } }
public class ObserverClient {
public static void main(String[] args) { AccountManager manager = new AccountManager(); AccountManager manager2 = new AccountManager(); Account account = new Account('Account1'); account.addObserver(manager); account.addObserver(manager2); account.setState(1); } } |
|
来自: liang1234_ > 《设计模式》