简易的设计模式——观察者模式
观察者模式(Observer Pattern)也叫做发布订阅模式。
定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则依赖于它的对象都会得到通知并被自动更新。
几种角色
在观察者模式中有这么几种角色:
- Subject被观察者:定义被观察者必须能动态地增加和删除观察者,一般为抽象类。
- Observer观察者:观察者接受到消息之后,能对接受到得消息进行处理。
- ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义哪些事件需要进行通知。
- ConcreteObserver具体的观察者:在接收到消息之后,对消息进行不同的处理。
代码实现
观察者 Observer.java
public interface Observer {
public void update();
}
具体的观察者 ConcreteObserver.java
public class ConcreteObserver implements Observer {
@Override
public void update() {
System.out.println("接收到消息,并进行处理!");
}
}
被观察者 Subject.java
import java.util.Vector;
public abstract class Subject {
//也可以使用ArrayList,ArrayList是线程异步的,不安全。
private Vector<Observer> obsVector = new Vector<Observer>();
public void addObserver(Observer observer){
this.obsVector.add(observer);
}
public void delObserver(Observer observer){
this.obsVector.remove(observer);
}
public void notifyObservers(){
for (Observer observer: this.obsVector ){
observer.update();
}
}
}
具体的被观察者 ConcreteSubject.java
public class ConcreteSubject extends Subject {
public void doSomething(){
//do something
super.notifyObservers();
}
}
场景类 Client.java
public class Client {
public static void main(String args[]){
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer = new ConcreteObserver();
subject.addObserver(observer);
subject.doSomething();
}
}
观察者模式的优点
-
观察者和被观察者之间是抽象耦合
即使不断增加观察者还是被观察者非常容易扩展
-
建立一套触发机制
根据单一职责原则,每个类的职责是单一的,通过一个触发机制,形成触发链。观察者就可以实现这种链式结构。
观察者模式的缺点
- 观察者模式需要考虑一下开发效率和运行效率,当形成多级触发的时候,效率会令人担忧。消息的通知可以采用异步的方式进行。