一:定义观察者模式

定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都收到通知并自动更新。

二:观察者模式类图:

三:观察者模式的自我理解:

(1)<<interface>>Observer: 定义了观察者更新的操作接口

(2)<<interface>>Subject:定义了对象的注册,注销和通知数据更新的三个接口

(3)ConcreteObserver类,主要是实现了<<interface>>Observer的更新操作

(4)ConcreteSubject类,我们也可以称管理类,主要是实现了<<interface>>Subject定义的注册,注销和通知数据更新的三个接口,其中的一个关键变量-List<ConcreteObserver> concreteObserver,这个变量主要是对所有的观察者进行管理,当数据改变时,遍历所有的观察者,进行相对应的操作。

四:我的一个小例子:

这个例子是Head First设计模式(中文版)这本书中最后的一个小程序,我在android上实现了。这个例子是当我点击一个按键时,有二个观察者,一个观察者(天使)会说:亲,我是天使,我对于您的点击,我的答复是:我爱你!!,另一个观察者(恶魔)会说:亲,我是恶魔,我对于您的点击,我的答复是:我恨你!!

在这个例子中,我应用了单例模式,观察者模式。

(1)<<interface>>Observer:

public interface IClickListernObserver {public void onClickToUpdate();
}

(2)ConcreteObserver类-----AngelObserver:

public class AngelObserver implements IClickListernObserver {private static AngelObserver instance;private IAngelClickLister myIAngelClickLister;public AngelObserver(){ClickListerManager.getInstance().registerObserver(this);}public static AngelObserver getInstance(){if(instance == null)instance = new AngelObserver();return instance;}public void setMyIAngelClickLister(IAngelClickLister myIAngelClickLister){this.myIAngelClickLister = myIAngelClickLister;}@Overridepublic void onClickToUpdate() {// TODO Auto-generated method stubmyIAngelClickLister.onClickAngelDo();}public interface IAngelClickLister{public void onClickAngelDo();       }}

(3)ConcreteObserver类-----DevilObserver :

public class DevilObserver implements IClickListernObserver {private static DevilObserver instance;private IDevilClickLister myIDevilClickLister;public DevilObserver(){ClickListerManager.getInstance().registerObserver(this);}public static DevilObserver getInstance(){if(instance == null)instance = new DevilObserver();return instance;}public void setMyIDevilClickLister(IDevilClickLister myIDevilClickLister){this.myIDevilClickLister = myIDevilClickLister;}@Overridepublic void onClickToUpdate() {// TODO Auto-generated method stubmyIDevilClickLister.onClickDevilDo();}public interface IDevilClickLister{public void onClickDevilDo();       }   }

(4)<<interface>>Subject:

public interface Subject {public void registerObserver(IClickListernObserver o);public void unRegisterObserver(IClickListernObserver o);public void notifyObservers();
}

(5)ConcreteSubject类:

import java.util.ArrayList;
import java.util.List;public class ClickListerManager implements Subject {private static ClickListerManager instance;private List<IClickListernObserver> observers;public ClickListerManager(){observers = new ArrayList<IClickListernObserver>();}public static ClickListerManager getInstance(){if(instance == null)instance = new ClickListerManager();return instance;}public void notifyAllItem(){notifyObservers();}@Overridepublic void registerObserver(IClickListernObserver object) {// TODO Auto-generated method stubif(!observers.contains(object)){observers.add(object);                    }   }@Overridepublic void unRegisterObserver(IClickListernObserver object) {// TODO Auto-generated method stubif(observers.contains(object)){observers.remove(object);             }       }@Overridepublic void notifyObservers() {// TODO Auto-generated method stubfor(int i = 0;i < observers.size();i++){observers.get(i).onClickToUpdate();}}
}

(6)ContentObserverActivity类:

import com.example.testcontentobserver01.AngelObserver.IAngelClickLister;
import com.example.testcontentobserver01.DevilObserver.IDevilClickLister;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;public class ContentObserverActivity extends Activity implements OnClickListener,IAngelClickLister, IDevilClickLister{private Button myButton;private TextView myTextViewAngel;private TextView myTextViewDevil;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_content_observer); init(); myButton = (Button) findViewById(R.id.myButton);myButton.setOnClickListener(this);     myTextViewAngel = (TextView) findViewById(R.id.myTextViewAngel);myTextViewDevil = (TextView) findViewById(R.id.myTextViewDevil);}private void init() {// TODO Auto-generated method stubAngelObserver.getInstance();AngelObserver.getInstance().setMyIAngelClickLister(this);DevilObserver.getInstance();DevilObserver.getInstance().setMyIDevilClickLister(this);}@Overridepublic void onClick(View view) {// TODO Auto-generated method stubint id = view.getId();switch(id){case R.id.myButton:ClickListerManager.getInstance().notifyAllItem();         }}@Overridepublic void onClickAngelDo() {// TODO Auto-generated method stubmyTextViewAngel.setText("亲,我是天使,我对于您的点击,我的答复是:我爱你!!");}@Overridepublic void onClickDevilDo() {// TODO Auto-generated method stubmyTextViewDevil.setText("亲,我是恶魔,我对于您的点击,我的答复是:我恨你!!");}}

五:气象监测应用

这个例子也是Head First设计模式(中文版)这本书中的说明样例,这个例子是现在有三个显示装置,一个要显示气象站的温度,一个显示湿度,一个显示气压,并且当这三个数据有改变时,要实时的更新三个显示装置,并且还要方便以后增加显示装置。

解决方案是观察者模式:

(1)类图:

(2)interface Subject:

public interface Subject{public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers();
}

(3)interface Observer:

public interface Observer{public void update(float temp,float humidity,float pressure);
}

(4)interface DisplayElement:

public interface DisplayElement{public void display();
}

(5)WeatherData 类:

public class WeatherData implements Subject{private ArrayList observers;private float temperature;
private float humidity;
private float pressure;public void registerObserver(Observer o){observers.add(o);
}public void removeObserver (Observer o){int i = observers.indexOf(o);if(i >= 0){observers.remove(i);}
}public void notifyObservers (){for(int i = 0; i < observers.size(); i++ ){
Observer observers = (Observer)observers.get(i);
observers.update(temperature, humidity, pressure);
}
}public void measurementsChanged(){notifyObservers();
}public void setMeasurements(float temperature, float humidity, float pressure){this. temperature = temperature;this. humidity = humidity;this. pressure = pressure;measurementsChanged();
}
………………….
}

(6)类CurrentConditionsDisplay:

public class CurrentConditionsDisplay implements Observer, DisplayElement{private float temperature;private float humidity;private Subject weatherData;public CurrentConditionsDisplay(Subject weatherData){this. weatherData = weatherData;weatherData. registerObserver(this);
}public void update(float temperature, float humidity, float pressure){this. temperature = temperature;this. humidity = humidity;display();
}public void display(){System.out.println(“Current conditions:” + temperature + “F degrees and ” + humidity + “% humidity”);
}
}

(7)相类似的,我们可以实现StatisticsDisplay,ForecastDisplay二个类
省略

(8)测试类:

public class WeatherStation{public static void main(String[] args){
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
ForecastDisplay forecastDisplay = new ForecastDisplay (weatherData); weatherData. setMeasurements(80,65,30.4f);
weatherData. setMeasurements(70,75,31.4f);
weatherData. setMeasurements(90,55,32.4f);}
}

参考资料:

1.http://blog.csdn.net/hfreeman2011/article/details/8308873
2.Head First设计模式(中文版),中国电力出版社出版,O‘REILLY公司译----(39--78页)观察者模式

设计模式之内容观察者模式相关推荐

  1. Java 设计模式之《观察者模式》

    很久之前,自己也曾看过一些设计模式的内容,最近在做一些程序代码设计的时,发现忘得差不多了,很多模式也只是有大致影响,决定重新将一些常用的模式复习一下.今天一个模式观察者模式. 观察者模式 观察者模式属 ...

  2. 设计模式相关内容介绍

    1.设计模式相关内容介绍 1.1. 设计模式概述 创建型模式--------买建筑材料 用于描述------怎样创建对象,它的主要特点是----------将对象的创建与使用分离,这样可以降低系统的耦 ...

  3. 设计模式(四) Observe——观察者模式

    设计模式四 Observe--观察者模式 观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于 ...

  4. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  5. Unity3D 设计模式学习之观察者模式

    游戏里成就系统可以使用观察者模式.要实现成就系统之前,一般需要企划单位先将需要的成就事件列出来,并在项目完成到某个段落之后,才开始加入实现开发中. 大致实现逻辑: 先定义"游戏事件" ...

  6. 开发之路(设计模式二:观察者模式)

    继续我们的设计模式学习,有个好的"观察者"可以让你开发效率大大提高 直接进入正题,我们用一个气象站程序来模拟此模式. 有一个气象站程序,能对湿度,温度,气压进行监测并显示在&quo ...

  7. java 观察者模式_重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」...

    一.前言 知道的越多不知道的就越多 编程开发这条路上的知识是无穷无尽的,就像以前你敢说精通Java,到后来学到越来越多只想写了解Java,过了几年现在可能想说懂一点点Java.当视野和格局的扩大,会让 ...

  8. Java描述设计模式(11):观察者模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.观察者模式 1.概念描述 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.观察者模式定义了一种一对多 ...

  9. 设计模式之十三观察者模式

    前言: 观察者模式 亦称: 事件订阅者.监听者.Event-Subscriber.Listener.Observer,是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 &qu ...

最新文章

  1. JNI中String和char之间的相互转换
  2. 提高工作效率-shell操作快捷键
  3. 【洛谷P3369】普通平衡树(splay)
  4. 【CV秋季划】图像质量提升与编辑有哪些研究和应用,如何循序渐进地学习好?...
  5. 好程序员Web前端分享无法忽视的JavaScript技巧
  6. Work Measurement - 1
  7. C++中没有定义类的引用。
  8. Matlab优化求解器中的Tolerances and Stopping Criteria
  9. html5图片动且平移,HTML5 Canvas平移,放缩,旋转演示
  10. Spring之AOP理解
  11. 洛谷P3332 K大数查询
  12. matlab求解常微分方程的实验,实验五__用matlab求解常微分方程
  13. php cms下载地址,让PHPCMS下载内容页显示链接真实地址
  14. 【问题】SQL远程过程调用失败
  15. autojs代码大全(实战演练)
  16. office2016专业增强版语言包 VOL
  17. 关于jeecg 项目的莫名其妙的问题
  18. Simulink三相异步电机仿真
  19. android app防止锁屏_解决安卓app锁屏掉线问题
  20. kafka中的ISR、AR又代表什么?ISR伸缩又是什么?

热门文章

  1. JavaSE基础知识
  2. 图像处理那张熟悉的面孔——Lena
  3. ios中设置app音效音效和震动
  4. Codeforces965—A:Paper Airplanes(思维)
  5. Java SpringMVC毕业项目实战-学生信息管理系统
  6. php编辑菱形图案代码,vb怎么输出菱形图案?vb绘制菱形的教程
  7. [POJ2352] Stars 夜空星辰 - 树状数组
  8. Heiro试用失败记
  9. android studio拨打电话代码,AndroidStudio实现拨打电话和发短信(kotlin)
  10. 谈谈c语言中delay的用法