观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式结构图如下所示:
主要代码如下所示:
public abstract class Observer {
public abstract void Update();
}
abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void Attach(Observer observer) {
observers.add(observer);
}
public void Detach(Observer observer) {
observers.remove(observer);
}
public void Notify() {
for (Observer o : observers) {
o.Update();
}
}
}
class ConcreteSubject extends Subject {
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
class ConcreteObserver extends Observer {
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject, String name) {
this.subject = subject;
this.name = name;
}
public void Update() {
observerState = subject.getSubjectState();
}
public ConcreteSubject getSubject() {
return subject;
}
public void setSubject(ConcreteSubject subject1) {
this.subject = subject1;
}
}
观察者模式将一个系统分割成一系列相互协作类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
代理模式优点:
- 代理模式能够协调调用者和被调用者,在一定程序上降低了系统的耦合度
- 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了保护目标对象的作用
缺点是:
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
- 实现代理模式需要额外的工作,有些代理模式的实现非常复杂