[设计模式-行为型]观察者模式(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):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...
随机推荐
- 安装CentOS 5.x与多重引导小技巧
不建议使用Virtualbox安装Linux来学习!本处是学习在计算机上安装Linux. 但现在条件有限,就先使用Virtualbox练习!
- 软工实践Beta冲刺(2/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- Hadoop世界中的HelloWorld之WordCount具体分析
MapReduce 应用举例:单词计数 WorldCount可以说是MapReduce中的helloworld了,下面来看看hadoop中的例子worldcount对其进行的处理过程,也能对mapre ...
- 配置Mac自带的Apache http服务器
Mac系统是自带Apache,所以很方便我们做一些http测试. 我可以先启动默认的服务器 $ sudo apachectl start 在浏览器打开:http://localhost 将会看到下面信 ...
- [OS] 进程相关知识点
进程概念: 1.程序在执行中 2.一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程,是系统进行资源分配和调度的独立单位. 进程与程序的差别: ·进程----动态, 程序----静态 ·进程 ...
- [剑指Offer] 28.数组中出现次数超过一半的数字
[思路]将每个数字都存入map中作为key值,将它们出现的次数作为value值,当value超过一半时则返回其key值. class Solution { public: int MoreThanHa ...
- Delphi xe7组件和控件的安装方法
暂时我所遇到的所有控件安装方法大体与下面两种相同. 若有不同大家提出来,一起想办法解决. .dproj格式的组件安装方法: raise组件 安装详细步骤如下: 一.设置搜索路径1. 将本包中的文件连同 ...
- 【bzoj1452】[JSOI2009]Count 二维树状数组
题目描述 输入 输出 样例输入 样例输出 1 2 题解 二维树状数组 一开始没看到 1≤c≤100 ,想到了主X树和X块,结果发现c的范围那么小... 二维树状数组水题,和一维的一样,向上修改,向下查 ...
- 【算法】01分数规划 --- HNOI2009最小圈 & APIO2017商旅 & SDOI2017新生舞会
01分数规划:通常的问法是:在一张有 \(n\) 个点,\(m\) 条边的有向图中,每一条边均有其价值 \(v\) 与其代价 \(w\):求在图中的一个环使得这个环上所有的路径的权值和与代价和的比率最 ...
- 皮肤包项目的 Gradle 脚本演化
我在做的一个项目需要有换肤功能,换肤的方案是采用第三方库 ThemeSkinning 的实现(在其基础上修复若干 bug).皮肤的制作是把相关的资源放在一个 app module 中打包成 apk,当 ...