观察者模式又叫发布-订阅(Publish/Subscribe)模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
//Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或一个接口实现。它把所有对观察者对象的引用保存在一个聚集里面,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以拉回和删除观察者对象。
public 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 announce()
{
for (Observer obj : observers)
{
obj.update();
}
}
}
//Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个update()方法,这个方法叫做更新方法。
public abstract class Observer
{
public abstract void update();
}
//ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
public class ConcreteSubject extends Subject
{
// 具体被观察者状态
private String subjectState;
public String getSubjectState()
{
return subjectState;
}
public void setSubjectState(String subjectState)
{
this.subjectState = subjectState;
}
}
//ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。
public class ConcreteObserver extends Observer
{
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(String name, ConcreteSubject subject)
{
this.name = name;
this.subject = subject;
}
public void update()
{
observerState = subject.getSubjectState();
System.out.println("观察者" + name + "的新状态是" + observerState);
}
public ConcreteSubject getSubject()
{
return subject;
}
public void setSubject(ConcreteSubject subject)
{
this.subject = subject;
}
}
//客户端代码
public class Main
{
public static void main(String[] args)
{
ConcreteSubject s = new ConcreteSubject();
s.attach(new ConcreteObserver("X", s));
s.attach(new ConcreteObserver("Y", s));
s.attach(new ConcreteObserver("Z", s));
s.setSubjectState("ABC");
s.announce();
}
}
结果显示:
观察者X的新状态是ABC
观察者Y的新状态是ABC
观察者Z的新状态是ABC
Subject类为抽象通知者,一般用一个抽象类或者一个接口实现,它把所有对观察者对象的引用保存在一个聚集里,每个通知者都可以有任何数量的观察者。抽象通知者,可以增加和删除观察者对象。
Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到通知者通知时更新自己更新接口通常包含一个update方法
ConcreteSubject类,叫做具体通知者,将有关状态存入具体观察者对象:在具体通知者的内部状态改变时,给所有登记过的观察者发出通知
ConcreteObserver类,具体观察者,可以保存一个指向具体主题对象的应用
总的来说,就是对通知者抽象,对观察者抽象,通知者持有观察者集合,观察者持有通知者。
应用场景:当一个对象的改变需要同时改变其他对象的时候,而且不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
分享到:
相关推荐
设计模式参考《大话设计模式》 工厂简单模式 创造型模式 工厂方法模式 抽象工厂模式 原型模式 建造者模式 单例模式 结构型模式 队列模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 行为模式(类行为...
大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf大话设计模式总结.pdf
设计模式之《大话设计模式》.pptx
Android之大话设计模式——:抽象工厂模式借鉴.pdf
NULL 博文链接:https://forrest420.iteye.com/blog/1050306
大话设计模式 完整设计模式介绍
《大话设计模式》C++实现-design-patterns-cpp
读书笔记:大话设计模式C++
android之大话设计模式.pdf
《大话设计模式》对各种设计模式,做简要归纳(原创)
Android之大话设计模式——:抽象工厂模式参考.pdf
树懒自己整理的大话设计模式的修行笔记,对程序设计有很大的帮助,主要是以自己学习的习惯整理的!
读书笔记:设计模式大话设计模式
大话设计模式之外观模式 经典代码 C#类
android之大话设计模式整理.pdf
26种设计模式还包括其他如建造者模式、组合模式、享元模式、命令模式、模板方法模式、迭代器模式、访问者模式、备忘录模式、状态模式、解释器模式等,它们都有各自独特的作用和应用场景。掌握这些设计模式能够帮助...
大话设计模式源代码之简单工厂模式 经典代码
单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...
以上只是设计模式中的一部分,"大话模式源代码示例"涵盖的28个实例将覆盖更多的模式,如命令模式、职责链模式、状态模式、访问者模式等。通过这些源代码,我们可以深入理解每个模式的工作原理,学习如何在实际项目中...