java observer泛型_【Java】Observer Pattern

前言

代码来源于生活,更加高于生活。设计模式让我们的生活更加的方便。观测一个东西,盯着一个东西,关注一个公众号,这些东西,如果没有即时通知的话,我们又特别想了解这方面的内容,那么我们除了一直耗着时间找人看着,可能没有更好的方法了,观察者模式的思想就是本人不用亲自盯着变化,当这些东西变化了,会通知本人了解情况。下面采用Observer Pattern进行实现。

内容

精华:

定义了对象直接的一对多依赖,这样一来,当一个对象改变转变状态时,它的所有依赖者都会收到通知并自动更新。

原则:

为交互对象之间的松耦合设计而努力。松耦合设计更有弹性,更能应付变化。

UML图部分:

e0808acfe0bff00bc58d5c3a06f4084b.png

DEMO部分:

说明:左半部分接口和一个类,分别定义了流程中用到的方法,注册、更新、通知、删除等,具体类做了具体的实现。

/*

* author:zhoulitong

*/

interface Subject {

public void registerObserver(Observer o);//注册一个观察者

public void removeObserver(Observer o);//移除一个观察者

public void notifyObservers();//通知观察者

}

//weatherdata现在实现了subject接口

class WeatherData implements Subject{

private ArrayList observers;

private float temperature;

private float humidity;

private float pressure;

public WeatherData(){

observers = new ArrayList();

}

//注册观察者

public void registerObserver (Observer o){

observers.add(o);//此处定义observes为泛型类型,这种类型本身有增加删除方法;

}

//删除观察者

public void removeObserver(Observer o){

int i = observers.indexOf(o);//定义i为观察者的下标号

//如果存在观察者,就执行删除的方法

if(i>=0){

observers.remove(i);

}

}

//具体通知观察者内容

public void notifyObservers(){

//i为一群观察者的每一个观察者

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 perssure){

this.temperature = temperature;

this.humidity = humidity;

this.pressure = perssure;

measurementsChanged();

}

}

说明:右半部分功能为接受通知后要更新数据和显示数据。

interface Observer{

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

}

interface DisplayElement{

public void display();

}

//此布告板实现了Observer接口,所以可以从WeatherData对象中获得改变

class CurrentConditionsDisplay implements Observer,DisplayElement{

private float temperature;

private float humidity;

private Subject weatherData;

public CurrentConditionsDisplay(Subject weatherData){

this.weatherData = weatherData;

weatherData.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");

}

}

客户端:实例化一个weatherData对象和多个观察者对象,进行注册

public class WeatherStation{

public static void main(String[] args){

WeatherData weatherData = new WeatherData();

CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);

weatherData.setMeasurements(80, 65, 30.4f);

}

}

小结

在java中util里面有JDK自带的观察者Observer包,采用java自带的观察者也可以达到相同的功能,实现接口的时候,实现不同的更新方法就可以了。

279f0d1fa4ed66fb9639c2dbac0f077e.png

感谢您的宝贵时间···

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值