一、概述
        定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
二、适用性
1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面的时候。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2.当对一个对象的改变需要同时改变其它对象,而且不知道具体有多少对象需要改变的时候。
3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁的时候。
三、参与者
1.Subject(目标):目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者对象的接口。
2.Observer(观察者):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。
3.ConcreteSubject(具体目标):将有关状态存入各ConcreteObserver对象。当它的状态发生改变时,向它的各个观察者发出通知。
4.ConcreteObserver(具体观察者):维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。

四、类图

五、示例

Subject

  1. package cn.lynn.observer;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public abstract class Citizen {
  5. protected List<Policeman> polices;
  6. private String action = "normal";
  7. public String getAction() {
  8. return action;
  9. }
  10. public void setAction(String action) {
  11. this.action = action;
  12. }
  13. public void setPolices() {
  14. polices = new ArrayList<Policeman>();
  15. }
  16. public void register(Policeman police) {
  17. polices.add(police);
  18. }
  19. public void unregister(Policeman police) {
  20. polices.remove(police);
  21. }
  22. public abstract void notify(String action);
  23. }

Observer

  1. package cn.lynn.observer;
  2. public interface Policeman {
  3. public void setOut(Citizen citizen);
  4. }

ConcreteSubject

  1. package cn.lynn.observer;
  2. public class DongHuCitizen extends Citizen {
  3. public DongHuCitizen(Policeman police) {
  4. setPolices();
  5. register(police);
  6. }
  7. @Override
  8. public void notify(String action) {
  9. setAction(action);
  10. for (int i = 0; i < polices.size(); i++) {
  11. Policeman police = polices.get(i);
  12. police.setOut(this);
  13. }
  14. }
  15. }
  1. package cn.lynn.observer;
  2. public class NanHuCitizen extends Citizen {
  3. public NanHuCitizen(Policeman police) {
  4. setPolices();
  5. register(police);
  6. }
  7. @Override
  8. public void notify(String action) {
  9. setAction(action);
  10. for (int i = 0; i < polices.size(); i++) {
  11. Policeman police = polices.get(i);
  12. police.setOut(this);
  13. }
  14. }
  15. }

ConcreteObserver

  1. package cn.lynn.observer;
  2. public class DongHuPoliceman implements Policeman {
  3. @Override
  4. public void setOut(Citizen citizen) {
  5. String action = citizen.getAction();
  6. if(action.equals("normal")) {
  7. System.out.println("行为一切正常");
  8. } else if(action.equals("unnormal")) {
  9. System.out.println("有偷窃行为,东湖警察出动!");
  10. }
  11. }
  12. }
  1. package cn.lynn.observer;
  2. public class NanHuPoliceman implements Policeman {
  3. @Override
  4. public void setOut(Citizen citizen) {
  5. String action = citizen.getAction();
  6. if(action.equals("normal")) {
  7. System.out.println("行为一切正常");
  8. } else if(action.equals("unnormal")) {
  9. System.out.println("有抢劫行为,南湖警察出动!");
  10. }
  11. }
  12. }

Client

  1. package cn.lynn.observer;
  2. public class Client {
  3. public static void main(String[] args) {
  4. Policeman dhPolice = new DongHuPoliceman();
  5. Policeman nhPolice = new NanHuPoliceman();
  6. Citizen citizen = new DongHuCitizen(dhPolice);
  7. citizen.notify("normal");
  8. citizen.notify("unnormal");
  9. citizen = new NanHuCitizen(nhPolice);
  10. citizen.notify("normal");
  11. citizen.notify("unnormal");
  12. }
  13. }

Result

    1. 行为一切正常
    2. 有偷窃行为,东湖警察出动!
    3. 行为一切正常
    4. 有抢劫行为,南湖警察出动!

GoF23种设计模式之行为型模式之观察者模式的更多相关文章

  1. GoF23种设计模式之行为型模式之状态模式

    一.概述         定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻 ...

  2. GoF23种设计模式之行为型模式之策略模式

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 1概述           定义一系列算法,把它们一个个都封装起来,并且让它们可以相互 ...

  3. GoF23种设计模式之创建型模式之原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...

  4. GoF23种设计模式之行为型模式之迭代器模式

    一.概述    给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.二.适用性1.当访问一个聚合对象的内容而无需暴露它的内部表示的时候.2.当对聚合对象的多 ...

  5. GoF23种设计模式之行为型模式之解释器模式

    一.概述         给定一种语言和其文法的一种表示,再定义一个解释器,该解释器使用表示来解释语言中的句子. 二.适用性              当需要解释一种语言,并且可以将该语言中的句子表示 ...

  6. GoF23种设计模式之行为型模式之访问者模式

    概述 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依 ...

  7. GoF23种设计模式之创建型模式之工厂方法模式

    一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...

  8. GoF23种设计模式之创建型模式之抽象工厂模式

    一.概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 二.适用性 1.一个系统要独立于它的产品的创建.组合和表示的时候. 2.一个系统要由多个产品系列中的一个来配置的时候. ...

  9. GoF23种设计模式之创建型模式之建造者模式

    一.概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示. 二.适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候. 2.当构造过程必须允许 ...

随机推荐

  1. Java EE学习笔记(九)

    MyBatis的关联映射 1.关联关系概述 1).实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通 ...

  2. beanshell解析json(从简单到复杂)

    使用beanshell 解析单层Json: Json 数据如下: { "status":200, "code": 0, "message": ...

  3. 物体检测丨从R-CNN到Mask R-CNN

    这篇blog是我刚入目标检测方向,导师发给我的文献导读,深入浅出总结了object detection two-stage流派Faster R-CNN的发展史,读起来非常有趣.我一直想翻译这篇博客,在 ...

  4. 简单ui

    UI继承 jQuery 简易使用特性,提供高度抽象接口,短期改善网站易用性. jquery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 W ...

  5. JAVA基础之基本类型包装类、System类、Math类、Arrays类及大数据运算

    个人理解: 为了方便运算及调用一些方法,我们需要将基本类型的数值转换为对象:不过转换的时候需要特别注意好它们的类型到底是什么,需要调用方法的类名是哪个!特别注意是Byte常量池的相关问题(==):gc ...

  6. Kendo UI 移动应用开发简介

    Kendo UI 移动应用开发简介 Kendo UI 支持开发 Web 应用,前面介绍的 SPA,也支持开发移动应用,至于使用 HTML5 + JavaScript + CSS 开发移动是不是一个好的 ...

  7. (2017.10.10) 我对 JavaScript 历史的认识

    关于 JavaScript 的历史和来由相信学过 JavaScript 的小伙伴都能说出一二.我看过一些入门书籍第一章或者前言部分都有介绍,但是一直没捋清这段历史.今天通过两个问题,来加深我对 Jav ...

  8. 初识SeekBar

    SeekBar拖动条,是Progress的间接子类 <SeekBar android:id="@+id/seekBar1" android:layout_width=&quo ...

  9. javaSe-String/StringBuffer

    //String字符串.在进行字符串拼接的时候总是改变栈中指向堆中的位置 //StringBuffer字符串.在进行字符串拼接的时候不改变栈中指向堆中的位置 package com.java.chap ...

  10. BZOJ 3232: 圈地游戏 分数规划+判负环

    3232: 圈地游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 966  Solved: 466[Submit][Status][Discuss] ...