设计模式学习--观察者模式(Observer Pattern)

*/

public interface DisplayElement {

public void display();

}

4. 定义主题类:WeatherData实现接口

package observerPattern;

import java.util.ArrayList;

/**

  • WeatherData实现了Subject接口

  • @author wwj

*/

public class WeatherData implements Subject {

private ArrayList observers; //用于记录观察者

private float temperature; //温度

private float humidity; //湿度

private float pressure; //压力

public WeatherData() {

observers = new ArrayList();

}

@Override

public void registerObserver(Observer o) {

observers.add(o);

}

@Override

public void removeObserver(Observer o) {

int i = observers.indexOf(o);

if(i >= 0) {

observers.remove(i);

}

}

@Override

public void notifyObserver() {

for(int i = 0; i < observers.size(); i++) {

Observer observer = (Observer)observers.get(i);

observer.update(temperature, humidity, pressure);

}

}

public void measurementsChanged() {

notifyObserver();

}

public void setMeasurements(float temperature, float humidity, float pressure) {

this.temperature = temperature;

this.humidity = humidity;

this.pressure = pressure;

measurementsChanged();

}

}

5. 定义四个布告板类实现观察者接口和布告板接口

package observerPattern;

/**

  • 观察者类实现观察者接口和显示板接口

  • @author wwj

*/

public class CurrentConditionDisplay implements Observer, DisplayElement {

private float temperature;

private float humidity;

private Subject weathderData;

public CurrentConditionDisplay(Subject weathderData) {

this.weathderData = weathderData;

weathderData.registerObserver(this); //注册

}

@Override

public void display() {

System.out.println("Current coditions: " + temperature + "F degress and " + humidity + “% humidity”);

}

@Override

public void update(float temp, float humidity, float pressure) {

this.temperature = temp;

this.humidity = humidity;

display();

}

}

package observerPattern;

/**

  • 天气统计布告板

  • @author wwj

*/

public class StatisticsDisplay implements Observer, DisplayElement {

private float maxTemp = 0.0f;; //最大温度

private float minTemp = 200; //最小温度

private float tempSum = 0.0f; //统计温度和

private int numReadings; //统计温度次数

private WeatherData weatherData;

public StatisticsDisplay(WeatherData weatherData) {

this.weatherData = weatherData;

weatherData.registerObserver(this);

}

@Override

public void display() {

System.out.println("Avg/Max/Min temperature = " + (tempSum / numReadings) + “/” + maxTemp + “/” + minTemp);

}

@Override

public void update(float temp, float humidity, float pressure) {

tempSum += temp;

numReadings++;

if(temp > maxTemp) {

maxTemp = temp;

}

if(temp < minTemp) {

minTemp = temp;

}

display();

}

}

package observerPattern;

/**

  • 天气预报布告板

  • @author wwj

*/

public class ForecastDisplay implements Observer, DisplayElement {

private float currentPressure = 29.92f; //当前气压

private float lastPressure; //以往气压

private WeatherData weatherData;

public ForecastDisplay(WeatherData weatherData) {

this.weatherData = weatherData;

weatherData.registerObserver(this);

}

@Override

public void display() {

System.out.println(“Forcast:”);

if(currentPressure > lastPressure) {

System.out.println(“Improving weather on the way!”);

} else if(currentPressure == lastPressure) {

System.out.println(“more of the same”);

} else if(currentPressure < lastPressure) {

System.out.println(“Watch out for cooler, rainy weather”);

}

}

@Override

public void update(float temp, float humidity, float pressure) {

lastPressure = currentPressure;

currentPressure = pressure;

display();

}

}

package observerPattern;

/**

  • 酷热指数布告板

  • @author wwj

  • 注:那个计算酷热指数的公式不必深究

*/

public class HeatIndexDisplay implements Observer, DisplayElement {

float heatIndex = 0.0f;

private WeatherData weatherData;

public HeatIndexDisplay(WeatherData weatherData) {

this.weatherData = weatherData;

weatherData.registerObserver(this);

}

public void update(float t, float rh, float pressure) {

heatIndex = computeHeatIndex(t, rh);

display();

}

private float computeHeatIndex(float t, float rh) {

float index = (float)((16.923 + (0.185212 * t) + (5.37941 * rh) - (0.100254 * t * rh)

  • (0.00941695 * (t * t)) + (0.00728898 * (rh * rh))

  • (0.000345372 * (t * t * rh)) - (0.000814971 * (t * rh * rh)) +

(0.0000102102 * (t * t * rh * rh)) - (0.000038646 * (t * t * t)) + (0.0000291583 *

(rh * rh * rh)) + (0.00000142721 * (t * t * t * rh)) +

(0.000000197483 * (t * rh * rh * rh)) - (0.0000000218429 * (t * t * t * rh * rh)) +

0.000000000843296 * (t * t * rh * rh * rh)) -

(0.0000000000481975 * (t * t * t * rh * rh * rh)));

return index;

}

public void display() {

System.out.println("Heat index is " + heatIndex);

}

}

6. 来吧,开始测试

package observerPattern;

/**

  • 测试类

  • @author wwj

*/

public class WeatherStation {

public static void main(String[] args) {

//建立一个WeatherData对象

WeatherData weatherData = new WeatherData();

//第一个布告板

CurrentConditionDisplay currentDisplay = new CurrentConditionDisplay(

weatherData);

StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);

ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);

HeatIndexDisplay heatIndexDisplay = new HeatIndexDisplay(weatherData);

// 模拟新的气象数据

weatherData.setMeasurements(80, 65, 30.4f);

weatherData.setMeasurements(82, 70, 29.2f);

weatherData.setMeasurements(78, 90, 29.2f);

}

}

7. 测试结果:

Current coditions: 80.0F degress and 65.0% humidity

Avg/Max/Min temperature = 80.0/80.0/80.0

Forcast:

Improving weather on the way!

Heat index is 82.95535

Current coditions: 82.0F degress and 70.0% humidity

Avg/Max/Min temperature = 81.0/82.0/80.0

Forcast:

Watch out for cooler, rainy weather

Heat index is 86.90124

Current coditions: 78.0F degress and 90.0% humidity

Avg/Max/Min temperature = 80.0/82.0/78.0

Forcast:

more of the same

Heat index is 83.64967

以上的观察者模式实现是通过主题以“推”的方式通知观察者们,观察者可以在一次通知中一口气得到所有东西。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【算法合集】

【延伸Android必备知识点】

【Android部分高级架构视频学习资源】

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

d部分高级架构视频学习资源】**

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值