建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
属于 对象行为型模式。
实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用,否则将使两者之间紧密耦合起来,这违反了面向对象的设计原则。
观察者模式的主要角色如下:
# 抽象观察者
public interface Observer {
// 观察者的反应
void response();
}
# 具体观察者
public class ConcreteObserver1 implements Observer {
@Override
public void response() {
System.out.println("具体观察者 1 作出反应");
}
}
public class ConcreteObserver2 implements Observer {
@Override
public void response() {
System.out.println("具体观察者 2 作出反应");
}
}
# 抽象主题
public abstract class Subject {
protected List<Observer> observerList = new ArrayList<>();
/**
* 新增观察者
*/
public void add(Observer observer) {
observerList.add(observer);
}
public void remove(Observer observer) {
observerList.remove(observer);
}
/**
* 通知观察者
*/
public abstract void notifyObserver();
}
# 具体主题
public class ConcreteSubject extends Subject {
@Override
public void notifyObserver() {
System.out.println("具体目标发生变化...");
for (Observer observer : observerList) {
observer.response();
}
}
}
# Client
public class Client {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver1();
Observer observer2 = new ConcreteObserver2();
subject.add(observer1);
subject.add(observer2);
subject.notifyObserver();
subject.remove(observer1);
subject.notifyObserver();
}
}
多看一些源码会发现,这种模式还是比较常用的。当然观察者可以通过传入一些参数来做一些事情。
分析
优点
缺点
设计模式-18观察者模式(Observer Pattern)
原文:https://www.cnblogs.com/wuqinglong/p/12564514.html