`
xuningxiaoni
  • 浏览: 33641 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

观察者模式图和代码实现

阅读更多
观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有的依赖者都会收到通知并自动更新。
Subject是我们的主题接口,他有三个方法,一个是注册观察者,一个是删除观察者,另一个是通知观察者。当主题状态改变时,这个方法会被调用,以通知所有的观察者。

public interface Subject {

public void registerObserver(Observer observer);

public void removeObserver(Observer o);

public void notifyObservers();

}

Observer是我们的观察者接口,所有的观察者都要实现update()方法,以实现观察者接口。当气象观测值改变时,主题会把这些状态值当作方法的参数,传送给观察者。

public interface Observer {

public void update(float temperature,float humidity,float pressure);

}

DisplayElement是我们的显示气象信息的接口,它只包含了一个方法也就是display()。当布告板要显示时,调用此方法。所有的布告板都要实现这个接口。

public interface DiplayElement {

public void display();

}

这里要说的是uodate()方法,这个方法直接传进去了三个参数,这样的设计可能不太附合要求,因为你不能确定这三个参数就已经够用了不用再改了,万万一要改起来那就你就要回过头来修改之前的方法,这样就有悖我们的类的设计:对扩展开放,对修改关闭。所以有必要的话就用个javaBean类来封装,对update()方法直接传javaBean类。如:

public class TemperatureBean {

private float temperature;

private float humidity;

private float pressure;

public float getTemperature() {
return temperature;
}

public void setTemperature(float temperature) {
this.temperature = temperature;
}

public float getHumidity() {
return humidity;
}

public void setHumidity(float humidity) {
this.humidity = humidity;
}

public float getPressure() {
return pressure;
}

public void setPressure(float pressure) {
this.pressure = pressure;
}



}
以后要加属性就加好了。update(TemperatureBean bean);

WeatherData类是实现了主题的类,主要的作用就是对观察者的添加删除和通知。

public class WeatherData implements Subject{

private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;

public WeatherData(){
observers = new ArrayList();
}

public void notifyObservers() {
for(int i=0; i<observers.size(); i++){
Observer observer = (Observer)observers.get(i);
observer.update(temperature, humidity, pressure);
}
}

public void measurementsChanged(){
notifyObservers();
}

public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}

public void registerObserver(Observer observer) {
observers.add(observer);
}

public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if(i > 0){
observers.remove(o);
}
}


}
现在该是实现布告类了:

public class CurrentConditionsDiplay implements Observer,DiplayElement{

private float temperature;
private float humidity;
private Subject weatherDataSubject;

public CurrentConditionsDiplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}

public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}

public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}

}

public class ForecastDisplay implements Observer,DiplayElement{
private float temperature;
private float humidity;
private Subject weatherDataSubject;

public ForecastDisplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}

public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}

public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}

public class ThirdPartyDisplay implements Observer,DiplayElement{
private float temperature;
private float humidity;
private Subject weatherDataSubject;

public ThirdPartyDisplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}

public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}

public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}

测试一下:

public class Test1 {

/**
* @param args
*/
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDiplay displayConditionsDiplay = new CurrentConditionsDiplay(weatherData);
weatherData.setMeasurements(25,20,35F);
}

}


当然我们可以用java内置的观察模式Observer实现
jar cvf test.jar com

test.jar=要生成的jar文件名
com=总路径下面可能有路径test1,test2,test3等


  • 大小: 78.1 KB
分享到:
评论

相关推荐

    设计模式-观察者模式(讲解及其实现代码)

    观察者模式,也被称为发布-订阅模式,是软件设计中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的...在实际项目中,正确使用观察者模式可以有效地管理组件间的交互,实现高效且易于维护的代码结构。

    观察者模式案例学习代码

    在这个“观察者模式案例学习代码”中,我们可能会看到以下的实现步骤: 1. 定义Subject接口或抽象类,包含addObserver、removeObserver和notifyObservers等方法。 2. 创建ConcreteSubject类,实现Subject接口,维护...

    设计模式实现——观察者模式

    在实际开发中,我们可以结合其他设计模式,如工厂模式、策略模式等,来优化观察者模式的实现,提高代码的可读性和可维护性。同时,现代编程语言和框架(如React的生命周期方法、Angular的事件机制等)也内置了观察者...

    观察者模式示例源代码

    观察者模式的优点在于它松耦合了被观察者和观察者,使得两者可以独立地变化和发展。同时,它提供了一种抽象的方式让多个观察者共享同一份数据,降低了系统的复杂性。然而,需要注意的是,如果观察者数量过多,或者...

    观察者模式代码

    在给定的“观察者模式代码”中,观察者不仅观察目标对象,而且自己也可能成为被观察的对象,这种变体增加了模式的复杂性和灵活性。 首先,我们来了解一下观察者模式的基本组成部分: 1. **目标(Subject)**:这是...

    Java观察者模式代码全解析

    在压缩包`ObserverModel`中,你应该能找到一个完整的Java观察者模式代码示例,包括主题和观察者的具体实现,以及如何使用它们进行交互。通过阅读和理解这段代码,你可以更深入地掌握观察者模式的运用。

    观察者模式(附代码和解释)下载

    下面是一段简单的Java代码示例,展示了如何使用上述定义的接口和类来实现观察者模式。 ```java public class Client { public static void main(String[] args) { AbstractWatched watched = new ConcreteWatched...

    观察者模式实例代码

    在Java中,观察者模式可以通过Java内置的`java.util.Observable`类和`java.util.Observer`接口来实现。下面是一个简单的实例代码示例,详细注释将帮助理解观察者模式的工作原理: ```java // 定义主题(Subject),...

    Java观察者模式代码

    在Java中,观察者模式的实现主要依赖于`java.util.Observable`类和`java.util.Observer`接口。`Observable`类代表被观察的对象,而`Observer`接口则表示观察者。下面我们将详细介绍如何在Java中实现观察者模式。 1....

    Qt设计模式之观察者模式

    总结来说,Qt的观察者模式通过信号和槽机制实现了对象间的解耦,使得代码更加模块化,同时也提供了强大的事件处理能力。理解和熟练掌握这一模式,对于编写高效、可维护的Qt应用至关重要。无论是简单的用户界面交互,...

    观察者模式java实现观察者设计模式

    在Java中,我们可以利用Java提供的内置监听器机制来实现观察者模式,例如`ApplicationListener`和`ApplicationEvent`,这两个类主要用于Swing或JavaFX应用程序中的事件处理。 首先,我们来看`ApplicationListener`...

    观察者模式(包含简单代码)

    观察者模式是一种行为设计模式,它允许我们定义订阅机制,当对象的状态发生改变时,所有依赖于该状态的...此外,Java和.NET等现代编程语言提供了内置的事件和委托机制,简化了观察者模式的实现,但基本思想仍然相同。

    java设计模式系列之观察者模式代码

    在Java编程领域,设计模式是一种被广泛采用的最佳实践,它为解决常见的软件设计问题提供...在Java中,`java.util.Observable`和`java.util.Observer`是内置的观察者模式实现,可以方便地用于快速构建观察者模式的系统。

    C++ 实现观察者模式小例子

    通过阅读和分析这个代码,我们可以更深入地理解C++中观察者模式的实现细节。 总的来说,观察者模式是一种强大的设计工具,它使得对象间的耦合度降低,提高了代码的可维护性和扩展性。在这个C++实现的小例子中,我们...

    软件设计模式观察者模式代码

    观察者模式的核心概念包括两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它可以是任何类型的对象,只要这个对象的状态可能发生变化。观察者是对主题感兴趣的对象,它们订阅主题,以便在...

    设计模式之观察者模式Java实现

    在Java中,观察者模式通常通过Java内置的`java.util.Observable`类和`java.util.Observer`接口来实现。`Observable`类代表被观察的对象,它可以有多个观察者,而`Observer`接口则定义了观察者的通用行为。 首先,...

    观察者模式源代码_java

    在Java中,观察者模式的实现通常依赖于`java.util.Observable`类和`java.util.Observer`接口。`Observable`类代表被观察的对象,而`Observer`接口则是观察者的接口。以下是对这两个关键组件的详细解释: 1. `...

Global site tag (gtag.js) - Google Analytics