观察者模式定义
观察者模式(Observer Pattern)是一种对象行为模式,用于建立对象之间的一对多依赖关系。观察者模式,又叫发布-订阅模式。在这种模式中,有一个称为主题(Subject)的对象,它维护了一组依赖于它的观察者(Observers)。当主题的状态发生变化时,它会自动通知所有的观察者,使它们能够自动更新自己,以保持与主题状态的一致性。在观察者模式中,目标对象(主题)负责维护其依赖的观察者列表,并在其状态发生改变时主动通知这些观察者。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式的核心思想是松耦合,主题和观察者之间相互独立,彼此不直接依赖,从而使系统更加灵活和易于扩展。主题和观察者之间的关系是动态的,观察者可以随时加入或退出,而不会影响其他对象之间的通信。
观察者模式包含以下角色:
观察者模式优缺点:
优点:
缺点:
使用场景
以下举一个观察者模式的例子:
下面通过一个简单的例子来演示。
比如生活中,微信公众号是大家都普遍使用的东西,当用户关注了对应的公众号后,该公众号每次发新的东西出来时,关注了该公众号的用户就可以接收到该公众号发出的通知,这就是用到了观察者模式,用户作为观察者,公众号作为主题。
创建主题(Subject)
/**
* 主题(观察对象)
*/
public interface Subject {
//添加观察者
void add(Observer observer);
//删除观察者
void delete(Observer observer);
//通知观察者更新消息
void notify(String message);
}
创建具体主题(ConcreteSubject)
import java.util.ArrayList;
import java.util.List;
/**
* 具体主题(具体观察对象)
*/
public class ConcreteSubject implements Subject{
//定义一个集合,用来存储观察者对象
private List<Observer> userList = new ArrayList<>();
@Override
public void add(Observer observer) {
userList.add(observer);
}
@Override
public void delete(Observer observer) {
userList.remove(observer);
}
@Override
public void notify(String message) {
//遍历集合
for (Observer observer : userList) {
observer.update(message);
}
}
}
创建观察者(Observer)
/**
* 观察者
*/
public interface Observer {
void update(String message);
}
创建具体观察者(ConcreteObserver)
/**
* 具体观察者
*/
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println("通知该公众号关注者" + name + "," + message);
}
}
创建客户端(Client)
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 创建公众号(具体主题)
ConcreteSubject concreteSubject = new ConcreteSubject();
// 用户订阅公众号,及将观察者加入到该公众号的用户列表中
concreteSubject.add(new ConcreteObserver("小明"));
concreteSubject.add(new ConcreteObserver("小红"));
concreteSubject.add(new ConcreteObserver("小蓝"));
// 公众号发新的文章了,需要通知关注该公众号的所有用户
concreteSubject.notify("公众号发布了新的文章《如何学好java》,快去看看吧");
}
输出结果如下所示:
通知该公众号关注者小明,公众号发布了新的文章《如何学好java》,快去看看吧
通知该公众号关注者小红,公众号发布了新的文章《如何学好java》,快去看看吧
通知该公众号关注者小蓝,公众号发布了新的文章《如何学好java》,快去看看吧
在上述例子中,我们先定义了主题对象接口 Subject 和观察者对象接口 Observer。然后我们实现了具体的主题对象类 ConcreteSubject 和具体的观察者对象类 ConcreteObserver,在具体主题对象类中添加、删除和通知观察者对象,更改状态值并且通知所有的观察者对象。在具体观察者对象类 ConcreteObserver 中,实现更新自身状态的逻辑和输出通知语句。客户端Client中我们创建主题对象,并创建三个观察者对象并将它们添加到主题对象中,再调用主题对象的notify方法,触发对所有观察者对象发送通知。因此当后面更多的用户关注该公众号,只要将新的观察者加入到该公众号的用户列表中,当公众号发布新的文章时,就会统一对这些关注该公众号的用户发送通知了,实现广播通信的效果。
总而言之:
观察者模式是一种实现对象间一对多依赖关系的设计模式。在这种模式中,有一个称为主题的对象,它维护了一组依赖于它的观察者。当主题的状态发生变化时,它会自动通知所有的观察者,使它们能够自动更新自己,以保持与主题状态的一致性。它允许被观察者对象在状态改变时,自动通知其注册的观察者对象,实现消息的广播与通信。观察者模式的核心思想是松耦合,主题和观察者之间相互独立,彼此不直接依赖,从而使系统更加灵活和易于扩展。观察者模式包含四个主要角色:主题、观察者、具体主题和具体观察者。其优点包括解耦性、可扩展性和易于维护,缺点则可能导致内存泄漏和广播开销。
总之,观察者模式是一种强大的设计模式,适用于事件处理、消息通知、股票市场分析、实时日志记录、游戏开发以及团队协作等多种场景。通过合理使用观察者模式,我们可以构建出更加灵活、可扩展和高效的软件系统。
以上代码下载请点击该链接:https://github.com/Yarrow052/Java-package.git