Java设计模式——行为型模式之观察者模式
一、前言
在生活中我们会遇到这样的场景:用水壶烧开水。当水烧开时,你会有一个关火的过程。在烧水的过程中,你一直观察着这个烧水的进度,当它的状态改变时会触发你关火的这个动作。观察者模式就是处理这种场景而设计出来的一种设计模式。
二、观察者模式
概述: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式是为了处理一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
使用场景:
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设计模式——行为型模式之观察者模式相关推荐
- 设计模式-行为型模式-Observer 观察者模式
设计模式-行为型模式-Observer 观察者模式 1.简介 软件程序之间的解耦,减少相互之间的依赖关系,但是模块之间又是需要协同工作的: 观察者模式使得一个对象的状态发生改变的时候,已经预约的其他对 ...
- JAVA设计模式 - 创建型模式总结
JAVA设计模式 - 单例模式 JAVA设计模式 - 工厂方法模式 JAVA设计模式 - 抽象工厂模式 JAVA设计模式 - 原型模式 JAVA设计模式 - 建造者模式 1 . 创建型模式的定义 顾名 ...
- java设计模式5--原型模式(Prototype)
本文地址:http://www.cnblogs.com/archimedes/p/java-prototype-pattern.html,转载请注明源地址. 原型模式 用原型实例指定创建对象的种类,并 ...
- 从零开始学习Java设计模式 | 创建型模式篇:原型模式
在本讲,我们来学习一下创建型模式里面的第四个设计模式,即原型模式. 概述 原型模式就是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象. 这段话读起来有点绕,是不是? ...
- 【Java设计模式 - 创建型模式1】单例模式
java设计模式之单例模式 简介 场景 实现 单例模式的几种实现方式 懒汉式,线程不安全 懒汉式,线程安全 饿汉式 双检锁/双重校验锁(DCL,即 double-checked locking) 登记 ...
- 从零开始学习Java设计模式 | 创建型模式篇:建造者模式
在本讲,我们来学习一下创建型模式里面的最后一个设计模式,即建造者模式. 概述 建造者模式是指将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 读完这句话之后,我估计很多人都已经懵 ...
- 从零开始学习Java设计模式 | 创建型模式篇:抽象工厂模式
在本讲,我们来学习一下创建型模式里面的第三个设计模式,即抽象工厂模式. 前言 前面介绍的工厂方法模式中考虑的是一类产品,如畜牧场只养动物.电视机厂只生产电视机(不生产空调.冰箱等其它的电器).计算机学 ...
- java设计模式-行为型模式
行为型模式用于控制对象的行为. 状态模式:将对象的状态抽象为一个类,是对if switch等状态判断的代替,Context类.State接口及其具体类. 备忘录模式:获取对象状态没在对象之外保存状态, ...
- 设计模式----行为型模式之观察者模式(Observer Pattern)
下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...
最新文章
- SpringBoot+Mybatis 实现动态数据源切换方案
- Dev控件用法 aspxTreeList 无刷新 aspxGridView 数据
- Codeforces 235C Cyclical Quest (后缀自动机)
- tvar julia pca_景德镇品种多样PCA牛卡纸追求品质
- utc时间转换为时分秒_C语言操作时间函数,实现定时执行某个任务小程序
- js变量显示在html中_PythonDjango+JS+Ajax实现网页采集并动态显示PLC变量
- Linux环境中的帮助命令有,Linux下的帮助命令
- golang db事务的统一封装
- DSF 洛谷 P1294 高手去散步
- 寒霜系列引擎技术解析
- 联想Y40加装固态硬盘
- 一政网:考教师编制,掌握出题结构很重要!
- 最优化理论笔记及期末复习(《数值最优化》——高立)
- python网络爬虫一
- 程序员自学编程,推荐一些高质量自学网站?
- Monthly expense(二分)
- 1.Adobenbsp;CS6nbsp;系列,安装…
- 基于拉普拉斯金字塔的图像融合算法
- python深度学习之TCN实例
- 计算机学院新生篮球赛名字,计算机学院新生篮球赛策划书(10页)-原创力文档...