[设计模式-行为型]观察者模式(Observer)
一句话
事件监听就是观察者模式最好的例子。
概括
解析
OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦
观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
实例
最简单的例子就是定义目标和一些观察者,当目标发生变化的时候,通知观察者。
还是回到软硬件生产的例子。
举手机的生产为例子:
当硬件产品生产完成之后,通知哪些部门
当软件产品生产完成之后, 通知哪些部门
这里的产品就是一个目标, 部门就是监听者
包含的类文件:
目标类的抽象类(Product.java)
两个目标类(HardwareProduct.java,SoftwareProduct.java)
监听类的接口(Dept.java)
两个监听类(FinanceDept.java,SalesDept.java)
测试类: Testm
/** * @author oscar999 * @date 2015-1-8 * @version V1.0 */ package designptn.observer; import java.util.ArrayList; import java.util.List; public abstract class Product { List<Dept> depts; abstract void sentMessage(String msg); public void setDepts() { this.depts = new ArrayList<Dept>(); } public void register(Dept dept) { this.depts.add(dept); } public void unRegister(Dept dept) { this.depts.remove(dept); } }
/** * @author oscar999 * @date 2015-1-8 * @version V1.0 */ package designptn.observer; public class HardwareProduct extends Product { public HardwareProduct(Dept dept){ setDepts(); register(dept); } @Override void sentMessage(String msg) { // TODO Auto-generated method stub System.out.println("get msg="+msg); for(int i=0;i<depts.size();i++) { Dept dept = depts.get(i); dept.action(this); } } }
/** * @author oscar999 * @date 2015-1-8 * @version V1.0 */ package designptn.observer; public class SoftwareProduct extends Product { public SoftwareProduct(Dept dept){ setDepts(); register(dept); } @Override void sentMessage(String msg) { System.out.println("get msg="+msg); // TODO Auto-generated method stub for(int i=0;i<depts.size();i++) { Dept dept = depts.get(i); dept.action(this); } } }
/** * @author oscar999 * @date 2015-1-8 * @version V1.0 */ package designptn.observer; public interface Dept { void action(Product product); }
/** * @author oscar999 * @date 2015-1-8 * @version V1.0 */ package designptn.observer; /** * @author Administrator * */ public class FinanceDept implements Dept { @Override public void action(Product product) { // TODO Auto-generated method stub System.out.println("Finance Dept action!"); } }
/** * @author oscar999 * @date 2015-1-8 * @version V1.0 */ package designptn.observer; /** * @author Administrator * */ public class SalesDept implements Dept { @Override public void action(Product product) { // TODO Auto-generated method stub System.out.println("Sales Dept action!"); } }
/** * @author oscar999 * @date 2015-1-8 * @version V1.0 */ package designptn.observer; public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub Dept sDept = new SalesDept(); Dept fDept = new FinanceDept(); Product product = new HardwareProduct(sDept); product.sentMessage("Hardware OK"); System.out.println("================"); product = new SoftwareProduct(fDept); product.sentMessage("Software OK"); } }
[设计模式-行为型]观察者模式(Observer)的更多相关文章
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- 我理解设计模式C++实现观察者模式Observer Pattern
概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...
- 设计模式系列之观察者模式(Observer Pattern)
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作 ...
- 《JAVA设计模式》之观察者模式(Observer)
在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Mo ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- 设计模式-观察者模式(Observer Pattern)
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...
随机推荐
- java正则表达式 3 -- 查找
用正则表达式执行查找命令,则需要用正则对象,其规则和执行顺序如下: 指定为字符串的正则表达式必须首先被便以为此类的实例.然后,可将得到的正则对象匹配任意的字符串用于创建Mather对象,执行匹配所涉及 ...
- Hibernate常用方法之_修改
1.使用session的saveOrUpdate方法 public void updateUser(User user){ Session session = null; Transaction tr ...
- 除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new
除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new
- sql 先查出已知的数据或者需要的数据再筛选
sql 先查出已知的数据或者需要的数据再筛选
- Firefox浏览器浏览自己做的网站需要输入用户名和密码解决
我用最新的Firefox 35.0浏览我制作的网站,就会弹出这个对话框.这是什么原因?
- Powershell快速入门
Powershell快速入门 来源: https://blog.csdn.net/u011054333/article/details/72567590 https://blog.csdn.net/u ...
- [CF327E]Axis Walking([洛谷P2396]yyy loves Maths VII)
题目大意:给一个长度为$n(1\leqslant n\leqslant24)$的序列$S$和$k(0\leqslant k\leqslant2)$个数. 求有多少种$S$的排列方式使得其任何一个前缀和 ...
- nodejs 喜欢报cannot find module .....的简单解决方案
在安装nodejs后使用命令npm install <package_name>一直喜欢报cannot find module........ 因为我之前在我的电脑上安装过nodejs,当 ...
- sls语法:创建file,创建文件夹
http://blog.kukafei520.net/html/2014/942.html /tmp/aaa.txt: file.managed /tmp/salt_test: file.direct ...
- 马上给Meltdown和Spectre漏洞打补丁
元旦之后的第一个工作日可谓是惊喜不断,4号就传来了 Google Project Zero 等团队和个人报告的 Meltdown 和 Spectre 内核漏洞的消息,首先简单介绍一下这两个内核漏洞. ...