针对问题:在消息-通知 的程序结构中,为了通知待通知的对象,需在消息服务中持有所有的待通知的对象,消息服务和大量的待通知对象紧密的耦合在一起,无论是新添加一个通知对象、或是取消通知都必须改变消息服务。为了解决这个问题,消息服务(主题)必须提供注册和删除的接口,不仅如此,主题要想统一管理待通知的对象(观察者),所有观察者必须遵循某一规范,也就是在所有观察者中抽象出一个接口,主题无须打理观察者是什么,只要它遵循规范就行,这样就将以前的耦合进行了抽象,也就是松耦合。
观察者模式结构图:
观察者模式实现代码:
/**
* 主题接口
* @author bruce
*
*/
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
/**
* 观察者接口
* @author bruce
*
*/
public interface Observer {
public void update();
}
/**
* 主题实现
* @author bruce
*
*/
public class ConcreteSubject implements Subject{
private List<Observer> observers=new ArrayList<Observer>();
public void notifyObservers() {
for(Observer observer:observers){
observer.update();
}
}
public void registerObserver(Observer observer) {
if(!observers.contains(observer)){
observers.add(observer);
}
}
public void removeObserver(Observer observer) {
if(observers.contains(observer)){
observers.remove(observer);
}
}
}
/**
* 观察者A
* @author bruce
*
*/
public class ConcreteObserverA implements Observer{
private Subject subject;
public ConcreteObserverA(Subject subject){
this.subject=subject;
this.subject.registerObserver(this);
}
public void update() {
// TODO Auto-generated method stub
System.out.println("通知观察者A");
}
}
/**
* 观察者B
* @author bruce
*
*/
public class ConcreteObserverB implements Observer{
private Subject subject;
public ConcreteObserverB(Subject subject){
this.subject=subject;
this.subject.registerObserver(this);
}
public void update() {
// TODO Auto-generated method stub
System.out.println("通知观察者B");
}
}
/**
* 测试
* @author bruce
*
*/
public class Client {
public static void main(String[] args) {
Subject subject=new ConcreteSubject();//创建主题
Observer observerA=new ConcreteObserverA(subject);//创建观察者A,并注册
Observer observerB=new ConcreteObserverB(subject);//创建观察者B,并注册
System.out.println("---------");
subject.notifyObservers();
System.out.println("---------");
subject.removeObserver(observerA);//观察者A取消收听
subject.notifyObservers();
/**
* output:
* ---------
通知观察者A
通知观察者B
---------
通知观察者B
*
*/
}
}
- 大小: 5.9 KB
分享到:
相关推荐
撤销功能的实现——备忘录模式(三) 撤销功能的实现——备忘录模式(四) 撤销功能的实现——备忘录模式(五) 观察者模式-Observer Pattern 对象间的联动——观察者模式(一) 对象间的联动——观察者模式(二) ...
在"Observer HeadFirst design pattern"中,作者通过生动的比喻和互动式的例子,帮助读者深入理解观察者模式的核心概念和实现方式。 观察者模式的核心思想是将"主题"(Subject)与"观察者"(Observer)解耦,主题...
5. **观察者模式(Observer)**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式广泛应用于事件驱动编程和发布/订阅系统。 6. **装饰器...
19. **观察者模式**:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 20. **状态模式**:允许对象在其内部状态改变时改变它的行为,对象看起来似乎改变...
- 详细解释了观察者模式的原理及应用场景。 - 分析了观察者模式在 .NET 平台上的实现细节。 - **第 3 章:装饰器模式**(页码:6) - 描述了装饰器模式的作用及其与其他模式的区别。 - 展示了装饰器模式在 .NET ...
- 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变其行为,对象看...
3. 行为型模式:这类模式主要关注对象间的交互和责任分配,如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、备忘录模式(Memento...
观察者模式(Observer)定义了对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新;职责链模式(Chain of Responsibility)通过把请求从一个对象传到下一个对象的方式,...
- 观察者模式:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式:允许对象在其内部状态改变时改变其行为,看起来像改变了其类。 - 策略模式:...
- 观察者模式:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式:允许一个对象在其内部状态改变时改变它的行为,看起来像是改变了它的类。 -...
- **观察者**(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - **状态**(State):允许一个对象在其内部状态改变时改变它的行为。 - **...
- 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 - 状态模式(State):允许对象在内部状态改变时改变它的行为,对象看起来...
#### 第2章:让对象保持同步——观察者模式 观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。本章通过具体的示例,...
观察者模式(Observer Pattern)**:当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这一模式在Cocoa中用于实现动态数据绑定等功能。 **2. 代理模式(Proxy Pattern)**:通过代理对象来...