一、前言

在生活中我们会遇到这样的场景:用水壶烧开水。当水烧开时,你会有一个关火的过程。在烧水的过程中,你一直观察着这个烧水的进度,当它的状态改变时会触发你关火的这个动作。观察者模式就是处理这种场景而设计出来的一种设计模式。

二、观察者模式

概述: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

观察者模式是为了处理一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

使用场景:

1.    当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。

3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。

简而言之观察者模式就是处理两个相互依赖对象的耦合关系。

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点:1、如果观察者过多会导致通知观察者时间过长,从而导致系统的性能下降。

三、代码展示

我们通过一个警察出巡的例子来演示观察者 模式。

3.1 定义一个目标接口,这个接口里需要存放观察者,通常都用一个list来存放这些观察者,并提供对这些观察者进行注册、删除的方法。

public abstract class Citizen {List pols;String help = "normal";public void setHelp(String help) {this.help = help;}public String getHelp() {return this.help;}abstract void sendMessage(String help);public void setPolicemen() {this.pols = new ArrayList();}public void register(Policeman pol) {this.pols.add(pol);}public void unRegister(Policeman pol) {this.pols.remove(pol);}
}
3.2 定义警察这个观察者
public interface Policeman {void action(Citizen ci);
}
3.3 实现目标接口
public class HuangPuCitizen extends Citizen {public HuangPuCitizen(Policeman pol) {setPolicemen();register(pol);}public void sendMessage(String help) {setHelp(help);for(int i = 0; i < pols.size(); i++) {Policeman pol = pols.get(i);//通知警察行动pol.action(this);}}
}
public class TianHeCitizen extends Citizen {public TianHeCitizen(Policeman pol) {setPolicemen();register(pol);}public void sendMessage(String help) {setHelp(help);for (int i = 0; i < pols.size(); i++) {Policeman pol = pols.get(i);//通知警察行动pol.action(this);}}
}

3.4 实现观察者接口

public class HuangPuPoliceman implements Policeman {public void action(Citizen ci) {String help = ci.getHelp();if (help.equals("normal")) {System.out.println("一切正常, 不用出动");}if (help.equals("unnormal")) {System.out.println("有犯罪行为, 黄埔警察出动!");}}
}
public class TianHePoliceman implements Policeman {public void action(Citizen ci) {String help = ci.getHelp();if (help.equals("normal")) {System.out.println("一切正常, 不用出动");}if (help.equals("unnormal")) {System.out.println("有犯罪行为, 天河警察出动!");}}
}

3.5 结果展示

public class Test{public static void main(String[] args) {Policeman thPol = new TianHePoliceman();Policeman hpPol = new HuangPuPoliceman();Citizen citizen = new HuangPuCitizen(hpPol);citizen.sendMessage("unnormal");citizen.sendMessage("normal");System.out.println("===========");citizen = new TianHeCitizen(thPol);citizen.sendMessage("normal");citizen.sendMessage("unnormal");}
}
有犯罪行为, 黄埔警察出动!
一切正常, 不用出动
===========
一切正常, 不用出动
有犯罪行为, 天河警察出动!

我们可以发现,在这个例子中,观察者和目标都做了抽象,这样做可以降低观察者和目标的耦合度。

Java设计模式——行为型模式之观察者模式相关推荐

  1. 设计模式-行为型模式-Observer 观察者模式

    设计模式-行为型模式-Observer 观察者模式 1.简介 软件程序之间的解耦,减少相互之间的依赖关系,但是模块之间又是需要协同工作的: 观察者模式使得一个对象的状态发生改变的时候,已经预约的其他对 ...

  2. JAVA设计模式 - 创建型模式总结

    JAVA设计模式 - 单例模式 JAVA设计模式 - 工厂方法模式 JAVA设计模式 - 抽象工厂模式 JAVA设计模式 - 原型模式 JAVA设计模式 - 建造者模式 1 . 创建型模式的定义 顾名 ...

  3. java设计模式5--原型模式(Prototype)

    本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,转载请注明源地址. 原型模式 用原型实例指定创建对象的种类,并 ...

  4. 从零开始学习Java设计模式 | 创建型模式篇:原型模式

    在本讲,我们来学习一下创建型模式里面的第四个设计模式,即原型模式. 概述 原型模式就是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象. 这段话读起来有点绕,是不是? ...

  5. 【Java设计模式 - 创建型模式1】单例模式

    java设计模式之单例模式 简介 场景 实现 单例模式的几种实现方式 懒汉式,线程不安全 懒汉式,线程安全 饿汉式 双检锁/双重校验锁(DCL,即 double-checked locking) 登记 ...

  6. 从零开始学习Java设计模式 | 创建型模式篇:建造者模式

    在本讲,我们来学习一下创建型模式里面的最后一个设计模式,即建造者模式. 概述 建造者模式是指将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 读完这句话之后,我估计很多人都已经懵 ...

  7. 从零开始学习Java设计模式 | 创建型模式篇:抽象工厂模式

    在本讲,我们来学习一下创建型模式里面的第三个设计模式,即抽象工厂模式. 前言 前面介绍的工厂方法模式中考虑的是一类产品,如畜牧场只养动物.电视机厂只生产电视机(不生产空调.冰箱等其它的电器).计算机学 ...

  8. java设计模式-行为型模式

    行为型模式用于控制对象的行为. 状态模式:将对象的状态抽象为一个类,是对if switch等状态判断的代替,Context类.State接口及其具体类. 备忘录模式:获取对象状态没在对象之外保存状态, ...

  9. 设计模式----行为型模式之观察者模式(Observer Pattern)

    下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...

最新文章

  1. SpringBoot+Mybatis 实现动态数据源切换方案
  2. Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据
  3. Codeforces 235C Cyclical Quest (后缀自动机)
  4. tvar julia pca_景德镇品种多样PCA牛卡纸追求品质
  5. utc时间转换为时分秒_C语言操作时间函数,实现定时执行某个任务小程序
  6. js变量显示在html中_PythonDjango+JS+Ajax实现网页采集并动态显示PLC变量
  7. Linux环境中的帮助命令有,Linux下的帮助命令
  8. golang db事务的统一封装
  9. DSF 洛谷 P1294 高手去散步
  10. 寒霜系列引擎技术解析
  11. 联想Y40加装固态硬盘
  12. 一政网:考教师编制,掌握出题结构很重要!
  13. 最优化理论笔记及期末复习(《数值最优化》——高立)
  14. python网络爬虫一
  15. 程序员自学编程,推荐一些高质量自学网站?
  16. Monthly expense(二分)
  17. 1.Adobenbsp;CS6nbsp;系列,安装…
  18. 基于拉普拉斯金字塔的图像融合算法
  19. python深度学习之TCN实例
  20. 计算机学院新生篮球赛名字,计算机学院新生篮球赛策划书(10页)-原创力文档...

热门文章

  1. 浅谈聚合支付系统的安全性
  2. djay Pro 2 Mac(DJ混音软件) v2.0.11激活版
  3. 同账号下阿里云ecs克隆——通过镜像更换系统
  4. IDEA中修改项目与Moudle名称方法总结
  5. 亚马逊与独立站的区别,站外引流,私域流量
  6. 找个问道自动架设工具
  7. 计算机组成原理-宝典
  8. 电加热炉温度控制系统的研究与设计
  9. 支付沙箱环境测试和验签
  10. 2017年博客第一篇随笔