观察者模式
描述:
- 观察者模式(也称为发布/订阅模式)提供了避免组件之间紧密耦合的另一种方法,它将观察者和被观察的对象分离开。
- 在该模式中,一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。
- 当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者收到消息后所执行的操作与可观察的对象无关,这种模式使得对象可以相互对话,而不必了解原因
- Java语言与C#语言的事件处理机制就是采用的此种设计模式。
类图
/*========主题接口=====*/
interface Subject{
public void registerObserver(Observer o);//注册观察者
public void removeObserver(Observer o);//移除观察者
public void notifyObserver();//通知观察者
}
/*========所有观察者接口========*/
interface Observer{
public void update(float temp);//更新天气情况
}
/*=========实际的观察者=============*/
class WhetherDisplay implements Observer{
private float temperature;
public WhetherDisplay(Subject subject){
subject.registerObserver(this);//将自身注入到观察者集合中
}
@Override
public void update(float temp) {
this.temperature=temp;
display();
}
public void display(){
System.out.println("【1】天气变化=》 " + temperature);
}
}
/*=========实际的观察者=============*/
class WhetherDisplay2 implements Observer{
private float temperature;
public WhetherDisplay2(Subject subject){
subject.registerObserver(this);//将自身注入到观察者集合中
}
@Override
public void update(float temp) {
this.temperature=temp;
display();
}
public void display(){
System.out.println("【2】天气变化=》 " + temperature);
}
}
/*==========具体需要观察的主题===========*/
class Whether implements Subject{
//添加
private ArrayList<Observer> observers = new ArrayList<>();
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 notifyObserver() {
//逐个通知观察者集合中的所有观察者
for (int i=0;i<observers.size();i++){
this.observers.get(i).update(temperature);
}
}
public void setTemperature(float temperature) {
this.temperature = temperature;
notifyObserver();//当监视到天气被改变之后就通知
}
}
public class Test {
public static void main(String[] args) {
Whether whether = new Whether();//需要观察的主题
WhetherDisplay observer1 = new WhetherDisplay(whether);//观察者observer1开始观察天气变化
WhetherDisplay2 observer2 = new WhetherDisplay2(whether);//观察者observer2开始观察天气变化
whether.setTemperature(23);
whether.setTemperature(43);
}
}
本文详细介绍了观察者模式的工作原理,并通过Java和C#的例子展示如何使用事件处理机制来解耦对象。讲解了主题接口、观察者接口以及如何创建和管理实际观察者。
1261

被折叠的 条评论
为什么被折叠?



