<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>#Coding on Jimmy's Blog</title><link>https://blog.jimersylee.com/tags/%23coding/</link><description>Recent content in #Coding on Jimmy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2015 09:36:00 +0000</lastBuildDate><atom:link href="https://blog.jimersylee.com/tags/%23coding/index.xml" rel="self" type="application/rss+xml"/><item><title>设计模式之观察者模式</title><link>https://blog.jimersylee.com/posts/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/</link><pubDate>Wed, 08 Apr 2015 09:36:00 +0000</pubDate><guid>https://blog.jimersylee.com/posts/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/</guid><description>&lt;h1 id="观察者模式observer"&gt;&lt;strong&gt;观察者模式(Observer)&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;让你的对象知悉现况&lt;/p&gt;
&lt;p&gt;使用自定义的Subject(主题)与Observer(观察者模式)&lt;/p&gt;
&lt;p&gt;设计原则&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;找出程序中会变化的方面,然后将其和固定不变的部分分离&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在观察者模式中,会改变的事主题的状态,以及观察者的数目和类型.用这个模式,你可以改变依赖于主题状态的对象,却不改变主题.这就叫提前规划&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;针对接口编程,不针对实现编程&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;主题与观察者都使用接口:观察者利用主题的接口向主题注册,二主题利用观察者接口通知观察者.这样可以让两者之前运作正常,同时具有松耦合的优点&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;多用组合,少用继承&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;观察者模式利用&amp;quot;组合&amp;quot;将许多观察者组合进主题中.对象之前的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的.&lt;/p&gt;
&lt;h1 id="自己实现观察者模式"&gt;&lt;strong&gt;自己实现观察者模式&lt;/strong&gt;&lt;/h1&gt;
&lt;h1 id="我们先定义主题接口"&gt;&lt;strong&gt;我们先定义主题接口&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/**
* 主题接口
*/publicinterfaceSubject {
publicvoidregisterObserver(Observer o);
publicvoidremoveObserver(Observer o);
publicvoidnotifyObservers();
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="定义观察者接口"&gt;&lt;strong&gt;定义观察者接口&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/**
* 观察者接口
*/publicinterfaceObserver {
publicvoidupdate(float temp,float humidity,float pressure);
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="显示元素接口"&gt;&lt;strong&gt;显示元素接口&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/**
* 显示元素接口
*/publicinterfaceDisplayElement {
publicvoiddisplay();
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="编写公告板实现实现了观察者接口与显示元素接口"&gt;&lt;strong&gt;编写公告板实现,实现了观察者接口与显示元素接口&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/**
* 公告板实现
*/publicclassCurrentConditionDisplayimplementsObserver,DisplayElement {
privatefloat temperature;
privatefloat humidity;
private Subject weatherData;
/**
* 构造器需要weatherData对象(也就是主题)作为注册之用
* @param weatherData:天气对象
*/publicCurrentConditionDisplay(Subject weatherData){
this.weatherData=weatherData;
weatherData.registerObserver(this);
}
/**
* display()方法就只是把最近的问的和湿度显示出来
*/@Override
publicvoiddisplay() {
System.out.println(&amp;#34;Current conditions:&amp;#34;+temperature+&amp;#34;F degree and &amp;#34;+humidity+&amp;#34;% humidity&amp;#34;);
}
/**
* 当update被调用时,我们把温度和湿度保存起来,然后调用display
* @param temp
* @param humidity
* @param pressure
*/@Override
publicvoidupdate(float temp,float humidity,float pressure) {
this.temperature=temp;
this.humidity=humidity;
display();
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="天气数据实现主题接口"&gt;&lt;strong&gt;天气数据实现主题接口&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;import java.util.ArrayList;
/**
* 天气数据类实现了Subject(主题)接口
*/publicclassWeatherDataimplementsSubject {
private ArrayList&amp;lt;Observer&amp;gt; observers;
privatefloat temperature;
privatefloat humidity;
privatefloat pressure;
publicWeatherData(){
observers=new ArrayList&amp;lt;&amp;gt;();
}
@Override
publicvoidregisterObserver(Observer o) {
observers.add(o);
}
@Override
publicvoidremoveObserver(Observer o) {
int i=observers.indexOf(o);
if(i&amp;gt;=0){
observers.remove(i);
}
}
@Override
publicvoidnotifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
/**
* 此方法会在气象值变化时被调用
*/publicvoidmeasurementsChanged(){
notifyObservers();
}
publicvoidsetMeasurements(float temperature,float humidity,float pressure){
this.temperature=temperature;
this.humidity=humidity;
this.pressure=pressure;
measurementsChanged();
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="来个测试吧"&gt;&lt;strong&gt;来个测试吧&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;publicclass WeatherStation {
publicstaticvoidmain(String[] args){
WeatherData weatherData=new WeatherData();
CurrentConditionDisplay currentConditionDisplay=new CurrentConditionDisplay(weatherData);
weatherData.setMeasurements(80,65,30.4f);
}
}
#输出
Current conditions:80.0F degree and 65.0% humidity
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="使用java自带的observer"&gt;&lt;strong&gt;使用java自带的Observer&lt;/strong&gt;&lt;/h1&gt;
&lt;h1 id="定义显示元素接口"&gt;&lt;strong&gt;定义显示元素接口&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;package Observable;
publicinterfaceDisplayElement {
publicvoiddisplay();
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="实现观察者接口和显示元素接口"&gt;&lt;strong&gt;实现观察者接口和显示元素接口&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;package Observable;
import java.util.Observable;
import java.util.Observer;
/**
* 天气状况布告板
* Created by jimersylee on
*/publicclassCurrentConditionDisplayimplementsObserver,DisplayElement {
Observable observable;
privatefloat temperature;
privatefloat humidity;
publicCurrentConditionDisplay(Observable observable){
this.observable=observable;
observable.addObserver(this);
}
publicvoidupdate(Observable obs,Object arg){
if(obsinstanceof WeatherData){
WeatherData weatherData=(WeatherData)obs;
this.temperature=weatherData.getTemperature();
this.humidity=weatherData.getHumidity();
display();
}
}
publicvoiddisplay(){
System.out.println(&amp;#34;Current conditions:&amp;#34;+temperature+&amp;#34;F degrees and &amp;#34;+humidity+&amp;#34;% humidity&amp;#34;);
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="实现观察者抽象类"&gt;&lt;strong&gt;实现观察者抽象类&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;package Observable;
import java.util.Observable;
/**
* 使用java.util内置的观察者模式实现
* Created by jimersylee
*/publicclassWeatherDataextendsObservable {
privatefloat temperature;
privatefloat humidity;
privatefloat pressure;
publicWeatherData(){
}
publicvoidmeasurementsChanged(){
setChanged();
notifyObservers();
}
publicfloatgetTemperature(){
return temperature;
}
publicfloatgetHumidity(){
return humidity;
}
publicfloatgetPressure(){
return pressure;
}
publicvoidsetMeasurements(float temperature,float humidity,float pressure){
this.temperature=temperature;
this.humidity=humidity;
this.pressure=pressure;
measurementsChanged();
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="写个测试吧"&gt;&lt;strong&gt;写个测试吧&lt;/strong&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;package Observable;
publicclass WeatherStation {
publicstaticvoidmain(String[] args){
WeatherData weatherData=new WeatherData();
CurrentConditionDisplay currentConditionDisplay=new CurrentConditionDisplay(weatherData);
weatherData.setMeasurements(80,30,33.2f);
}
}
#输出
Current conditions:80.0F degrees and 30.0% humidity
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="项目地址"&gt;&lt;strong&gt;项目地址&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/jimersylee/DesignPattern"&gt;java设计模式实现&lt;/a&gt; 如果觉得有点收获,记得在项目上点star哦!&lt;/p&gt;</description></item></channel></rss>