Java设计模式——观察者模式(发布/订阅模式)

    碌碌无为的做了五年Java程序员,总是参考别人的代码,也该做点贡献了。代码大多参考网上书上的例子,谈谈个人对设计模式的理解。代码纯手敲,eclipse上运行通过。水平有限,请各位多多批评指正。

    以观察者模式开启设计模式之路。 

基本思想:

 

观察者

    (Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

被观察

    被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。

撤销观察

    观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除

 

出现率最高的天气预报例子:

 

 

代码

import java.util.ArrayList;

interface Subject {
	public void registerObserver(Observer o);

	public void removeObserver(Observer o);

	public void notifyObservers();
}

class Whether implements Subject {
	private ArrayList<Observer> observers = new ArrayList<Observer>();

	private float temperature;

	@Override
	public void notifyObservers() {
		for (int i = 0; i < this.observers.size(); i++) {
			this.observers.get(i).update(temperature);
		}
	}

	@Override
	public void registerObserver(Observer o) {
		this.observers.add(o);
	}

	@Override
	public void removeObserver(Observer o) {
		this.observers.remove(o);
	}

	public void whetherChange() {
		this.notifyObservers();
	}

	public float getTemperature() {
		return temperature;
	}

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

}

interface Observer {
	public void update(float temp);
}

class WhetherDisplay1 implements Observer {
	private float temperature;

	public WhetherDisplay1(Subject whether) {
		whether.registerObserver(this);
	}

	@Override
	public void update(float temp) {
		this.temperature = temp;
		display();
	}

	public void display() {
		System.out.println("display1****:" + this.temperature);
	}

}

class WhetherDisplay2 implements Observer {
	private float temperature;

	public WhetherDisplay2(Subject whether) {
		whether.registerObserver(this);
	}

	@Override
	public void update(float temp) {
		this.temperature = temp;
		display();
	}

	public void display() {
		System.out.println("display2****:" + this.temperature);
	}

}

public class Test {

	public static void main(String[] args) {
		Whether whether = new Whether();
		WhetherDisplay1 d1 = new WhetherDisplay1(whether);
		WhetherDisplay2 d2 = new WhetherDisplay2(whether);
		whether.setTemperature(27);
		whether.setTemperature(26);
		whether.removeObserver(d1);
		whether.setTemperature(30);
		whether.registerObserver(d1);
		whether.setTemperature(38);

	}
}

以上代码实现了简单的实现观察者模式的思想

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

益朋

看官老爷们的打赏是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值