一、概述
        定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
二、适用性
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. (转)linux dumpe2fs命令

    linux dumpe2fs命令 命令名称 dumpe2fs - 显示ext2/ext3/ext4文件系统信息. dumpe2fs命令语法 dumpe2fs [ -bfhixV ] [ -o supe ...

  2. java命令--jstack 工具

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  3. C#、VSTO讀取Excel類

    之前寫的類存在Excel進程不能結束的Bug,重寫ExcelReader類,類實例清理時Excel進程自動結束. class ExcelReader { // Excel Object public ...

  4. mysql(数据库,sql语句,普通查询)

    第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...

  5. Redhat/CentOS 软件安装

    概述 软件包简介 rpm 包安装 yum 在线安装 源码包管理 软件包分类 源码包 二进制包(rpm包.系统默认包) rpm包安装 rpm包的依赖性 树形依赖: a -> b -> c 环 ...

  6. ionic 2 起航 控件的使用 客户列表场景(二)

    首先放出我hithub项目代码例子,有兴趣研究探讨的同学可以去看看 https://github.com/linyuebin2016/ionic2.git 下面我们来尝试下第一个项目场景 一份客户的列 ...

  7. SharePoint Server 2016 WEB 网站浏览器支持

    SharePoint Server 2016支持多种常用的Web浏览器,如Internet Explorer,Google Chrome,Mozilla Firefox,Apple Safari和Mi ...

  8. URAL 1057 Amount of Degrees (数位DP,入门)

    题意: 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的,B的整数次幂之和.例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足了要求:  17 = 24+2 ...

  9. 51nod 1631 小鲨鱼在51nod小学

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依靠算法方面的特长,在班里担任了许多职务.   ...

  10. 【转载】UWP应用设置和文件设置:科普

    数据有两个基本的分类,应用数据和用户数据,而用户数据则为由用户拥有的数据,如文档,音乐或电子邮件等,下面将大致的介绍一下应用数据的基本操作. 应用数据:应用数据包含APP的状态信息(如运行时状态,用户 ...