观察者(Observer)模式
观察者模式是对象的行为模式,又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、
源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式定义了一种一对多的依赖关系,许多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,
会通知所有观察者对象,使它们能够自动更新自己。657P
一、观察者模式有以下几种结构:
1、抽象主题(Subject)角色:主题角色把所有对观察者对象的引用保存在一个聚集(比如Vector对象)里,每个主题都可以有任何
数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色。
2、抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象
观察者角色一般用一个抽象观察者角色一般用一个抽象或者一个接口实现,其中的方法叫做更新方法。
3、具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出
通知。具体主题角色又叫做具体被观察者角色(Concrete Observerable)。具体主题角色通常用一个具体子类实现,具体主题角色
负责实现对观察者引用的聚集的管理方法。
4、具体观察者角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与
主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。
第一种实现:由具体主题角色关联到抽象观察者角色
//抽象主题
public interface Subject{
//d调用这个方法登记一个新的观察者对象
public void attach(Observer observer);
//调用这个方法删除一个已经登记过的观察者对象
public void detach(Observer observer);
//调用这个方法通知所有登记过的观察者对象
void notifyObservers();
}
//具体主题角色
import java.util.Vector;
import java.util.Enumeration;
public class ConcreteSubject implements Subject{
private Vector observersVector = new Vector();
public void attach(Observer observer){
observersVector.addElement(observer);
}
public void detach(Observer observer){
observersVector.removeElement(observer);
}
public void notifyObservers(){
Enumeration enumeration = observers();
while(enumeration.hasMoreElements()){
((Observer)enumeration.nextElement()).update();
}
}
//这个方法给出观察者聚集的Enumeration对象
public Enumeration observers(){
return ((Vector)observersVector.clone()).elements();
}
}
//抽象观察者
public interface Observer{
void update();
}
public class ConcreteObserver implements Observer{
public void update(){
System.out.println("I am notified");
}
}
//第二种实现:由抽象主题角色代表出观察者对象的聚集连线到抽象观察者
//抽象主题
import java.util.Vector;
import java.util.Enumeration;
public abstract class Subject{
private Vector observersVector = new Vector();
public void attach(Observer observer){
observersVector.addElement(observer);
System.out.println("Attach an observer.");
}
public void detach(Observer observer){
observersVector.removeElement(observer);
}
public void notifyObservers(){
Enumeration enumeration = observers();
while(enumeration.hasMoreElement()){
((Observer)enumeration.nextElement()).update();
}
}
public Enumeration observers(){
return ((Vector)observersVector.clone()).elements();
}
}
//具体主题
public class ConcreteSubject extends Subject{
private String state;
public void change(String newState){
state = newState;
this.notifyObservers();
}
}
/...................
//客户端
public class Client{
private static ConcreteSubject subject;
private static Observer observer;
public static void main(String args[]){
//创建主题对象
subject = new ConcreteSubject();
//创建观察者对象
observer = new ConcreteObserver();
subject.attach(observer);
subject.change("new state");
}
}
二、观察者模式的优点和缺点
(1)优点
1、观察者模式在被观察者和观察者之间建立一个抽象的耦合,被观察者的接口。被观察者并不认识任何一个具体观察者,
它只知道它们都有一个共同的接口。由于被观察者个观察者没有紧密地耦合在一起,因此它们可以属于不同的
抽象化层次。如果被观察者和观察者都扔到一起,那么这个对象必然跨越抽象化和具体化层次。
2、观察者模式支持广播通信。被观察者会所有的登记过的观察者发出通知。
(2)缺点
1、如果一个被观察者对象有许多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式时
要特别注意这一点。
3、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
4、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察
的对象是怎么发生变化的。
分享到:
相关推荐
观察者模式,也被称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一,主要用于在对象之间建立一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它在Android开发中扮演着重要的角色,主要用于实现对象之间的解耦。在这个“观察者模式for android demo”中,我们将深入探讨如何在Android环境中应用该...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象事件发生时通知多个“观察”该对象的其他对象。在Python中,我们可以利用内置的事件处理系统或者自定义类来实现这种模式。...
观察者模式是一种行为设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 在上一节课中,我们已经了解了观察者模式的基本概念、实现方法...
观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式...
观察者模式的主要组件包括主题(Subject)和观察者(Observer)。主题是被观察的对象,它可以有多个观察者,当主题状态变化时,会通知所有注册的观察者。观察者则是对主题感兴趣的实体,它们在接收到主题的通知后,...
六、观察者模式(Observer) 观察者模式定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。C#中的事件和委托机制就是观察者模式的实现。 七、策略模式...
第22章 观察者模式(Observer) 22.1 模式解说 22.2 结构与用法 22.2.1 模式结构 22.2.2 代码模板 22.2.3 问题讨论 22.3 范例与实践 22.3.1 观察者模式在界面色彩主题中的应用 22.3.2 范例小结 第23章 状态...
第22章 观察者模式(Observer) 22.1 模式解说 22.2 结构与用法 22.2.1 模式结构 22.2.2 代码模板 22.2.3 问题讨论 22.3 范例与实践 22.3.1 观察者模式在界面色彩主题中的应用 22.3.2 范例小结 第...
4. 观察者模式(Observer Pattern):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知。 5. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的...
5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...
5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...
5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR...
5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...
5. **Observer(观察者)模式**:这种模式定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式非常适合实现事件处理系统。 6. **Layers(分层)...
5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...
11. 观察者模式(Observer): 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在C#中,事件和委托机制是实现观察者模式的关键。 12. 模板...
5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...
行为型模式则关注对象之间的交互和责任分配,例如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility)。 "Java设计模式第二版源码"可能包含了这些模式的实例,每个模式都通过...