前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >观察者模式

观察者模式

作者头像
晚上没宵夜
发布2022-05-09 21:08:37
1730
发布2022-05-09 21:08:37
举报

1. 观察者模式(Observer Pattern)

指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,它是对象行为型模式。主题(Subject)具有注册和移除观察者、并通知所有观察者的功能,主题是通过维护一张观察者列表来实现这些操作的。

顾名思义,观察者模式需要观察者和被观察者(主题),所以其主要组成对象有:

  • Subject(主题抽象类)
  • ConcreteSubject(主题实现类)
  • Observer(观察者抽象类)
  • ConcreteSubject(观察者实现类)

2. 流程

模拟一个场景:多个天气数据公告板会在天气信息发生改变时更新其内容

主题抽象类
代码语言:javascript
复制
public interface Subject {
	
    // 注册
    void resisterObserver(Observer o);

    // 移除
    void removeObserver(Observer o);

    // 通知
    void notifyObserver();
}
主题实现类
代码语言:javascript
复制
public class WeatherSubject implements Subject {

	// 维护的观察者列表
	private List<Observer> observers = new ArrayList<Observer>();
	
	// 主题的状态
    private float temperature;
    private float humidity;
    private float pressure;

	@Override
	public void resisterObserver(Observer observer) {
		observers.add(observer);
	}

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

	@Override
	// 就是这里通知的
	public void notifyObserver() {
		for(Observer value : observers){
			value.update(temperature, humidity, pressure);
		}
	}
	
	// 状态改变
	public void setMeasurements(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObserver();
	}
}
观察者抽象类
代码语言:javascript
复制
public abstract class Observer {
	
	public abstract void update(float temp, float humidity, float pressure);

}
观察者实现类
代码语言:javascript
复制
public class DisplayOne extends Observer {

	@Override
	public void update(float temp, float humidity, float pressure) {
		System.out.println("公告板1收到状态变更:" + temp + " " + humidity + " " + pressure);
	}
}
代码语言:javascript
复制
public class DisplayTwo extends Observer {

	@Override
	public void update(float temp, float humidity, float pressure) {
		System.out.println("公告板2收到状态变更:" + temp + " " + humidity + " " + pressure);
	}
}
测试
代码语言:javascript
复制
public class test {

	public static void main(String[] args) {
		
		Observer one = new DisplayOne();
		Observer two = new DisplayTwo();
		
		WeatherSubject subject = new WeatherSubject();
		subject.resisterObserver(one);
		subject.resisterObserver(two);
		
		// 天气变化
		System.out.println("天气变化了-----");
		subject.setMeasurements(100, 100, 100);
	}
}
代码语言:javascript
复制
天气变化了-----
公告板1收到状态变更:100.0 100.0 100.0
公告板2收到状态变更:100.0 100.0 100.0

https://www.pdai.tech/md/dev-spec/pattern/19_observer.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 观察者模式(Observer Pattern)
  • 2. 流程
    • 主题抽象类
      • 主题实现类
        • 观察者抽象类
          • 观察者实现类
            • 测试
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档