先是不成尝试:

运作结果:

图片 1

Java
JDK中也是都定义好的观察者模式,在java.util包着(Observable(主题),
Observer(观察者)),大家发趣味可以协调了解下。java中之观察者可以手动从主题中拉取数据,主题为可主动去推送数据。

numpy.where函数是大年初一表达式 x if condition else y 的矢量化版本,例如:

观察者模式定义:定义了对象期间的相同对准几近靠,这样一来,当一个目标改变时,它的享有依赖者都见面接到通知并自动更新。

像np.sum函数可以对数组里的素求与:

主题不需明白观察者具体是何许人也,只需要了解观察者实现了Observer接口,并无关心观察者具体做了安事,这种相互对象中的松耦合是计划受到追求的标准化,下面看主题Subject和观察者Observer接口代码:

数学及统计方法

诸如报社,订阅报纸后,报社会定期为您寄报纸,停止订阅后报社便停邮寄。我们管报社改称为“主题
Subject”,把订阅者改成为“观察者 Observer”来研讨观察者模式。

图片 2

 1 public class WeatherData implements Subject {
 2     private List<Observer> observerList;
 3     private float temperature;
 4     private float humidity;
 5     private float pressure;
 6     
 7     public WeatherData() {
 8         observerList = new ArrayList<Observer>();
 9     }
10     public void registerObserver(Observer o) {
11         observerList.add(o);
12     }
13 
14     public void removeObserver(Observer o) {
15         int i = observerList.indexOf(o);
16         if (i >= 0) {
17             observerList.remove(i);
18             System.out.println(o.getClass().getName() + " is removed.");
19         }
20     }
21 
22     public void notifyObservers() {
23         for (Observer o : observerList) {
24             o.update(temperature, humidity, pressure);
25         }
26     }
27     /*数据更新时,通知所有观察者*/
28     public void measurementsChanged() {
29         notifyObservers();
30     }
31 
32 }

还有一些函数接受2单参数,叫二初次ufunc,比如add函数和maximum函数:

 

图片 3

需要:WeatherData获得最新数据时,需要实时更新三独布告板的景象数据。三只布告板分别是:目前气象、气象统计、天气预报。

对此二维数组,sum函数也是拿装有因素求和,但是二维数组是发生横轴和竖轴两独样子的,所以sum函数对于二维数组还得依照方向拓展呼吁与:

1.WeatherData产生三个getter方法getTemperature(),getHumidity(),getPressure()分别赢得温度、湿度、气压值;

像,square函数计算各国因素的平方,rint函数将诸要素四放弃五符合:

 

图片 4

在的问题:针对落实编程,会难以扩大以及保护,如果用新增或去除布告板,必须修改该次。

numpy.where函数

代码测试:

如今让WeatherData实现主题接口:

np.where函数的次只参数和老三个参数不是少不了之,它们还好是标量值,例如:

 

矢量化指的是为此数组表达式代替循环来操作数组里的每个元素。

3.系统要而扩大,可随时新增或去布告板。

NumPy提供的通用函数(既ufunc函数)是一样栽对ndarray中的数据开展元素级别运算的函数。

 1 /*目前状况布告板*/
 2 public class CurrentConditionsDisplay implements Observer, DisplayElement {
 3 
 4     private float temperature;
 5     private float humidity;
 6     private Subject weatherData;
 7     
 8     public CurrentConditionsDisplay(Subject subject) {
 9         this.weatherData = subject;
10         weatherData.registerObserver(this);
11     }
12     
13     public void removeObserver() {
14         weatherData.removeObserver(this);
15     }
16 
17     public void update(float temp, float humidity, float pressure) {
18         this.temperature = temp;
19         this.humidity = humidity;
20         display();
21     }
22     
23     public void display() {
24         System.out.println("CurrentConditionsDisplay conditions:" + temperature + "F degrees and " + humidity + "% humidity");
25     }
26 
27 }
28 
29 /*天气预报布告板*/
30 public class ForecastDisplay implements Observer, DisplayElement {
31 
32     private float temperature;
33     private float pressure;
34     private Subject weatherData;
35     
36     public ForecastDisplay(Subject subject) {
37         this.weatherData = subject;
38         weatherData.registerObserver(this);
39     }
40     
41     public void removeObserver() {
42         weatherData.removeObserver(this);
43     }
44 
45     public void update(float temp, float humidity, float pressure) {
46         this.temperature = temp;
47         this.pressure = pressure;
48         display();
49     }
50     
51     public void display() {
52         System.out.println("ForecastDisplay conditions:" + temperature + "F degrees and " + pressure + "Pa");
53     }
54 
55 }
56 
57 /*气象状况布告板略*/

图片 5

 1 public class ObserverTest {
 2     
 3     @Test
 4     public void test() {
 5         WeatherData weatherDate = new WeatherData();
 6         CurrentConditionsDisplay ccDisplay = new CurrentConditionsDisplay(weatherDate);
 7         ForecastDisplay fcDisplay = new ForecastDisplay(weatherDate);
 8         weatherDate.setMeasurements(12.3f, 38.6f, 130f);
 9         ccDisplay.removeObserver();
10         weatherDate.setMeasurements(12.3f, 38.6f, 130f);
11         fcDisplay.removeObserver();
12         weatherDate.setMeasurements(12.3f, 38.6f, 130f);
13         System.out.println("notify ok");
14     }
15 }

图片 6

布告板实现观察者接口:

 

1 CurrentConditionsDisplay conditions:12.3F degrees and 38.6% humidity
2 ForecastDisplay conditions:12.3F degrees and 130.0Pa
3 com.project.design.observer.CurrentConditionsDisplay is removed.
4 ForecastDisplay conditions:12.3F degrees and 130.0Pa
5 com.project.design.observer.ForecastDisplay is removed.
6 notify ok
 1 public class WeatherData {
 2     
 3     public void measurementsChanged() {
 4         float temperature = getTemperature();
 5         float humidity = getHumidity();
 6         float pressure = getPressure();
 7         //目前状况布告板更新
 8         currentConditionsDisplay.update(temperature, humidity, pressure);
 9         //气象统计布告板更新
10         statisticsDisplay.update(temperature, humidity, pressure);
11         //天气预报布告板更新
12         forecastDisplay.update(temperature, humidity, pressure);
13     }
14     
15     //WeatherData的其他方法
16     
17 }

2.当数码变动时,WeatherData有只方法measurementsChanged()会为调用(我们无关心什么给调用),此时亟待创新三只布告板的景象信息;

气象站系统:气象站可以透过物理装置取得气象信息,WeatherData对象足以经过气象站提供的表接口获取气象信息。

1 /*观察者*/
2 public interface Observer {
3     public void update(float temp, float humidity, float pressure);
4 }

1 /*主题*/
2 public interface Subject {
3     /*注册成为观察者*/
4     public void registerObserver(Observer o);
5     /*移除观察者*/
6     public void removeObserver(Observer o);
7     /*通知所有观察者*/
8     public void notifyObservers();
9 }   

1 public interface DisplayElement {
2     /**
3      * 布告板都实现该接口,调用display来展示气象信息
4      */
5     public void display();
6 }

如出一辙、整理分析: