需要几个关键角色
1.被观察对象(可观察对象)
2.观察者
观察者想要观察被观察对象,就需要两者之间建立一种一对多的关系。
建立关系后,需要关注的一点就是如果将被观察者更新的消息传递给观察者。
一种是推的方式,即被观察更新信息后,立刻把数据推给观察者。
另一种是拉的方式,即观察者从被观察者那拉取数据。
先看推的方式吧
类图 : 一个可以被观察的接口 Obserable ,一个观察者 Observer
被观察者的实现,本文就是期望一个天气预报的更新
气象站 -- weatherData(被观察者) ---- Temperature(观察者)
代码实例:
被观察者;
package com.ming.test.observer;
public interface Observable {
void regisiterObserver(Observer o);
void removeObserver(Observer o);
void notifyObserver();
}
观察者:
package com.ming.test.observer;
public interface Observer {
void update(float t,float h,float p);
}
具体的业务操作接口:这里是简单的展示
package com.ming.test.observer;
public interface DisplayMent {
void display();
}
被观察者的实现
package com.ming.test.observer;
import java.util.ArrayList;
import java.util.List;
public class WeatherData implements Observable {
private List<Observer> observerList; //这里只是简单的原理实现,具体还需要考虑多线程并发的情况。具体自己写个简单的东西看看
private float t;
private float h;
private float p;
public WeatherData() {
observerList = new ArrayList<Observer>();
}
@Override
public void regisiterObserver(Observer o) {
observerList.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observerList.indexOf(o);
if (i > 0) {
observerList.remove(i);
}
}
//通知观察者
@Override
public void notifyObserver() {
for (int i = 0; i < observerList.size(); i++) {
Observer o = observerList.get(i);
o.update(t, h, p); //这里就是主动的给观察者推消息了!
}
}
public void changed() {
notifyObserver();
}
//数据更新了
public void setMeasurements(float t, float h, float p) {
this.t = t;
this.h = h;
this.p = p;
changed();
}
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
AOberver observer = new AOberver();
weatherData.regisiterObserver(observer);
weatherData.setMeasurements(0.2f, 0.3f, 0.6f);
System.out.println("this is seperator notation ----------------");
weatherData.setMeasurements(0.6f, 1.3f, 2.6f);
}
}
观察者:
package com.ming.test.observer;
public class AOberver implements Observer,DisplayMent {
private float t;
private float h;
//被被观察者对象调用,被动
@Override
public void update(float t, float h, float p) {
this.t = t;
this.h = h;
display();
}
@Override
public void display() {
System.out.println("the temperature is:" + t +"the humidity is :" + h);
}
}
分享到:
相关推荐
3. **观察者模式**:Android中的BroadcastReceiver就是观察者模式的实例,用于组件间的通信,当某个事件发生时,观察者会收到通知并做出相应。 4. **适配器模式**:ListView、RecyclerView等控件的Adapter就是...
行为型模式如策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式和解释器模式,关注的是对象之间的交互和职责分配。 案例源码部分则为读者提供了实际操作的...
- **观察者模式**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ### 三、附录A可能涵盖的内容 由于题目中提到的是附录部分,这部分内容往往是对...
- **观察者模式**:当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - **迭代器模式**:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 - **访问者...
23. **观察者模式**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 这个压缩包中的文件很可能是针对以上各个设计模式的详细讲解和代码示例,对于学习...
- 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变其行为,对象看起来似乎...
设计模式包括创建型模式(如单例、工厂方法、抽象工厂)、结构型模式(如适配器、装饰器、代理)和行为型模式(如策略、观察者、责任链)等。 2. **Java编程语言**:Java是一种广泛使用的面向对象的编程语言,以其...
7. **软件设计与分析**:理解面向对象编程的概念,如封装、继承、多态,以及设计模式(如单例模式、工厂模式、观察者模式)的应用。了解软件复杂度度量和性能优化策略。 8. **软件测试**:掌握软件测试的基本理论,...
6. **模式应用**:在软件设计中,模式是一种解决常见问题的模板,如工厂模式、观察者模式等。理解和应用设计模式可以提高代码的可读性、可维护性和复用性。在视频笔记中,可能会讲解如何在实际项目中运用这些模式。 ...
观察者模式 状态模式 策略模式 模板方法模式 访问者模式 设计案例 UML 架构 系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 协议设计 二进制协议...
16. 观察者模式(Observer Pattern):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 17. 责任链模式(Chain of Responsibility Pattern):为解除...
这些模式在帮助开发人员避免重复造轮子的同时,还能提高软件的可读性和可维护性,如工厂模式用于创建对象,单例模式保证类只有一个实例,观察者模式用于对象间的事件通知机制等。 《指南》的目标读者可能是软件...
- **观察者模式**:当对象的状态发生改变时通知所有观察者,使他们能够自动更新。 以上所述的设计模式是C/C++与设计模式基础课程中的重要内容,通过对这些模式的学习和实践,开发者可以显著提高软件设计的能力和...
- **观察者模式**:定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 - **策略模式**:定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。 - **...
16. **观察者模式**:观看者角色被动更新(A),被观看者通知更新(B),但观看者不应改变被观看者状态(C错误)。 17. **里式代换原则**:违反该原则时,可以通过创建新抽象类(A),委派关系(B),或者区分IS-a...
5. 设计模式的类别包括但不限于工厂模式、单例模式、策略模式、观察者模式、装饰模式等,这些都是程序员应当熟练掌握的模式。 6. 文档提到了UML(统一建模语言)和API(应用程序编程接口)的重要性,这两者都是软件...
- 深入讲解了在业务逻辑层中使用的具体设计模式,例如命令模式、观察者模式等。 - 提供了实际案例研究,展示如何在业务逻辑层中正确应用这些模式。 - **第6章:服务层**: - 介绍服务层的概念以及如何使用面向...