设计模式之观察者模式

什么是观察者模式

定义对象间一中一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

观察者模式也叫做发布订阅模式,也是一种很常用的设计模式。

举个栗子

观察者模式的模型图

观察者模式有四种角色,下面是具体编码

  • 被观察者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public abstract class Subject {
private Vector<Observer> observers = new Vector<>();
//添加观察者
public void addObserver(Observer observer) {
observers.add(observer);
}
//删除观察者
public void delObserver(Observer observer) {
observers.remove(observer);
}
//通知所有观察着
public void notifyObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
  • 具体被观察者
1
2
3
4
5
6
7
public class ConcreteSubject extends Subject {
public void method(){
//具体业务
System.out.println("method called");
super.notifyObservers();
}
}
  • 观察者
1
2
3
4
public interface Observer {
//更新
void update();
}
  • 具体观察者
1
2
3
4
5
6
7
public class ConcreteObserver implements Observer {
//收到消息更新
@Override
public void update() {
System.out.println("receive update");
}
}
  • 调用场景
1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args) {
ConcreteSubject subject=new ConcreteSubject();
Observer observer = new ConcreteObserver();
subject.addObserver(observer);
subject.method();
}
}

输出结果

1
2
method called
receive update

这就是观察者模式,一旦被观察者方法执行,观察者就会得到消息,这样可以实现通知功能。

适用场景

观察者模式适用于处理程序之间关联的问题,还有系统间通信,更新相应触发等等场景。

优点缺点

观察者模式优点是观察者和被观察者建立抽象耦合,易于扩展,同时形成一套消息触发的机制,很好的处理了一对多关联问题。

观察者模式的缺点是顺序执行下的效率问题,有时需要异步处理。

注意事项

需要注意的是一个目标可以既是观察者也是被观察者,这样就会产生链条式行为,所以一定要注意,消息尽量只转发一次,太多就可能出问题。

jdk接口实现观察者模式

jdk中其实默认实现了被观察者和观察者,所以上面的代码可以修改成这个样子

  • 被观察者
1
2
3
4
5
6
7
8
public class ConcreteSubject extends Observable{
public void method(){
//具体业务
System.out.println("method called");
super.setChanged();
super.notifyObservers();
}
}
  • 观察者
1
2
3
4
5
6
7
public class ConcreteObserver implements Observer {
//收到消息更新
@Override
public void update(Observable o, Object arg) {
System.out.println("receive update");
}
}

调用场景不变,不需要写自己的接口,这样就实现了观察者模式。

在java开发中的消息队列就是异步处理观察者模式的很好的例子。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!