观察者模式

观察者模式结构图

使用场景

1.需要推送到每一位订阅对象的时候。如微信公众号文章推送,报纸订阅推送。
2.观察者模式也可以使用的方法,要求主体推送由每个对象自由获取主体的每个属性,就不会强迫被迫接收一堆的属性。如果主体需要扩展功能,也不会影响到观察者本身,不用修改每个观察者的调用,只需要主体公布共多的get方法来取得新增的状态。
3.jdk本身也提供了观察者java.util.Observable类和java.util.Observer接口,但是由于Observable是一个类,而不是接口,限制了他的使用和复用,然而他提供了很多有用的功能,只是面对松耦合的程度来说不是那么完美。而且他的setChanged()方法使用了protected,意味着只有继承Observable才可以使用,无法组合到对象中来。

代码设计

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.
1.定义一个观察者变量,改类是用来注册或者删除的

public interface Subject {
	public void registerObserver(Observer o);
	public void removeoObserver(Observer o);
	public void notifyObserver();
}

2.定义一个观察者接口

/**
 * 观察者接口
 */
public interface Observer {
	public void update(float temp,float humidty,float pressure);
}

3.定义一个调用方法

public interface DisplayElement {
	/**
	 * 显示时调用
	 */
	public void display();
}

3.定义一个主体

package com.boco.eoms.observer;

import java.util.ArrayList;

public class WeatcherDate implements Subject {
	private ArrayList observers;
	private float temp;
	private float humidty;
	private float pressure;
	
	/**
	 * 用来记录观察者
	 */
	public WeatcherDate(){
		observers = new ArrayList();
	}
	
	public void registerObserver(Observer o){
		observers.add(o);
	};
	public void removeoObserver(Observer o){
		int i = observers.indexOf(o);
		if(i>0){
			observers.remove(i);
		}
	};
	//循环推送调用update,通知所有观察者
	public void notifyObserver(){
		for (int i = 0; i < observers.size(); i++) {
			Observer observer = (Observer)observers.get(i);
			observer.update(temp, humidty, pressure);
		}
	};
	public void measuermentsChanged(){//通知观察者
		notifyObserver();
	}
	public void setMeasurements(float temp,float humidty,float pressure){
		this.humidty = humidty;
		this.pressure = pressure;
		this.temp = temp;
		measuermentsChanged();
	}
}

4.定义了一个观察者

package com.boco.eoms.observer;


public class CurrentDisplay implements Observer,DisplayElement{
	private Subject whatchDate;
	private float temp;
	private float humidty;
	
	public CurrentDisplay (Subject whatchDate){
		//初始化主体,并且把自己传递给主体。
		this.whatchDate = whatchDate;
		//此时主体已经增加了这个观察者的对象
		whatchDate.registerObserver(this);
	}
	
	public void update(float temp,float humidty,float pressure){
		this.humidty = humidty;
		this.temp = temp;
		display();
	}
	
	public void display(){
		System.out.println(temp+"/"+humidty+"/"+"/");
	}
}

5.测试

package com.boco.eoms.observer;

public class Test {

	public static void main(String[] args) {
		WeatcherDate weatcherDate = new WeatcherDate();
		CurrentDisplay curr = new CurrentDisplay(weatcherDate);
		weatcherDate.setMeasurements(100f, 28.4f,88.1f);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值