观察者模式(发布/订阅模式)

  观察者模式提供了避免组件之间紧密耦合的另一种方法,它将观察者和被观察者的对象分离开。在该模式中,一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者收到消息后所执行的操作与可观察的对象无关,这种模式使得对象可以相互对话,而不必了解原因。java语言与C#语言的时间处理机制就是采用此种设计模式。

例如,用户界面(同一个数据可以有多种不同的显示方式)可以作为观察者,业务数据是被观察者,当数据有变化后会通知界面,界面收到通知后,会根据自己的显示方式修改界面的显示方式。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将它做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。设计类图如图所示。

下面给出一个观察者模式的示例代码,代码的主要功能是实现天气预报,同样的温度信息可以有多种不同的展示方式。

public interface Observer {
	//更新温度
	public void update(float temp);
}
public interface Subject {
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers();
}

import java.util.ArrayList;

public class Whether implements Subject {
	private ArrayList<Observer>observers = new ArrayList<Observer>();
	private float temperature;
	@Override
	public void registerObserver(Observer o) {
		this.observers.add(o);
	}

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

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

public 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);
	}

}

public 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);
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值