概述
定义:对象之间多对一的关系时的设计方案, 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
场景:订阅报刊业务的场景。
原理:Subject 具有登记注册观察者、移除观察者和通知观察者的三个核心方法。 观察者一个核心行为方法:给Subject通知观察者调用的方法。
由Subject来通知和调用注册进来的观察者的行为方法。
优点:
1.以集合的方式来管理依赖对象(Observer),三个核心方法:注册、移除和通知观察者。
2.遵守OCP原则,增加观察者时只需要增加Observer而不用修改核心代码。
源码:jdk的Observable使用到观察者模式
案例:
package shangguigu_designmode.observer_mode;
/**
* 主题:有三个核心方法,注册观察者、移除观察者和通知观察者
* */
public interface Subject {
//注册观察者
public void registerObserver(Observer observer);
//移除观察者
public void remove(Observer observer);
//通知观察者
public void notifyObserver();
}
/**
*
* 实现主题类,里面有三个属性:温度temperature 压力pressure 湿度humidity 来表示当前气象数据
* 1.包含当天的天气情况
* 2.观察者的集合使用ArrayList管理
* 3.当数据有更新时,主动调用,让接入方看到最新的消息
* */
public class WeatherData implements Subject{
//温度
private float temperature;
//压力
private float pressure;
//湿度
private float humidity;
//观察者集合
ArrayList<Observer> observers = new ArrayList<Observer>();
//一次性设置数据
public void setData(float temperature,float pressure,float humidity){
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
dataChange();
}
public float getTemperature() {
return temperature;
}
public void setTemperature(float temperature) {
this.temperature = temperature;
}
public float getPressure() {
return pressure;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}
public float getHumidity() {
return humidity;
}
public void setHumidity(float humidity) {
this.humidity = humidity;
}
//数据改变,通知观察者
public void dataChange(){
this.notifyObserver();
}
//注册观察者
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
//移除观察者
@Override
public void remove(Observer observer) {
if(observers.contains(observer)){
observers.remove(observer);
}
}
//遍历所有观察者,并通知
@Override
public void notifyObserver() {
for (int i = 0; i < observers.size(); i++) {
observers.get(i).update(this.temperature,this.pressure,this.humidity);
}
}
}
/**
* 观察者接口,具体观察者实现具体方法
* */
public interface Observer {
//观察者更新
public void update(float temperate,float press,float humidity);
}
/**
* 一个具体的观察者实现观察者接口并实现其更新方法
*/
public class BaiduObserver implements Observer{
private float temperature;
private float pressure;
private float humidity;
public float getTemperature() {
return temperature;
}
public void setTemperature(float temperature) {
this.temperature = temperature;
}
public float getPressure() {
return pressure;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}
public float getHumidity() {
return humidity;
}
public void setHumidity(float humidity) {
this.humidity = humidity;
}
@Override
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
display();
}
//显示
public void display(){
System.out.println("=========== 百度气象展示 ===========");
System.out.println("今天的温度是:"+ this.temperature);
System.out.println("今天的压力是:"+ this.pressure);
System.out.println("今天的湿度是:"+ this.humidity);
System.out.println("================================");
}
}
/**
* 测试类
* */
public class Client {
public static void main(String[] args) {
//创建一个WeatherData
WeatherData weatherData = new WeatherData();
//注册观察者
weatherData.registerObserver(new CurrentConditions());
weatherData.registerObserver(new BaiduObserver());
//测试
System.out.println();
weatherData.setData(10,100f,20.3f);
}
public void sourceCode(){
}
}
最后
以上就是失眠金鱼为你收集整理的设计模式之观察者模式学习总结的全部内容,希望文章能够帮你解决设计模式之观察者模式学习总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复