一句话

事件监听就是观察者模式最好的例子。

概括

解析

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)的更多相关文章

  1. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  2. 我理解设计模式C++实现观察者模式Observer Pattern

    概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...

  3. 设计模式系列之观察者模式(Observer Pattern)

    意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作 ...

  4. 《JAVA设计模式》之观察者模式(Observer)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Mo ...

  5. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)

    观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...

  6. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  7. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  8. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  9. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

随机推荐

  1. HDU 3697 Selecting courses(贪心+暴力)(2010 Asia Fuzhou Regional Contest)

    Description     A new Semester is coming and students are troubling for selecting courses. Students ...

  2. windows下 eclipse搭建spark java编译环境

    环境: win10 jdk1.8 之前有在虚拟机或者集群上安装spark安装包的,解压到你想要放spark的本地目录下,比如我的目录就是D:\Hadoop\spark-1.6.0-bin-hadoop ...

  3. Mybatis学习系列(六)延迟加载

    延迟加载其实就是将数据加载时机推迟,比如推迟嵌套查询的执行时机.在Mybatis中经常用到关联查询,但是并不是任何时候都需要立即返回关联查询结果.比如查询订单信息,并不一定需要及时返回订单对应的产品信 ...

  4. Extjs的API阅读方式(整理)

    原文链接:http://www.cnblogs.com/gaojun/archive/2013/05/28/3103908.html

  5. POJ3415 Common Substrings 【后缀数组 + 单调栈】

    常见的子串 时间限制: 5000MS   内存限制: 65536K 提交总数: 11942   接受: 4051 描述 字符串T的子字符串被定义为: Ť(我,ķ)= Ť 我 Ť 我 1 ... Ť I ...

  6. 将一张表的主键(ID)重置为从1开始自增排列

    如果你有一张表,你的主键是ID,然后由于测来测去的原因,你的ID不是从1开始连续的自增了. 终于有一天,使用这张表的某个系统要导入正式数据了,强迫症这时候就表现的明显了,浑身不自在, 这时候你就需要将 ...

  7. Spring validation 后端校验【转】

    本文来自 下一秒升华 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u013815546/article/details/77248003?utm_source=co ...

  8. CSS样式实现溢出超出DIV边框宽度高度的内容自动隐藏方法

    CSS样式实现溢出超出DIV边框宽度高度的内容自动隐藏方法 平时我们布局时候,有的文字内容多了会超过溢出我们限制的高度,有的图片会撑破DIV,让网页错位变乱. 这样我们就需要解决如何使用CSS来超出设 ...

  9. css实现九宫格图片自适应布局

    我之前写九宫格自适应布局的时候,每个格子是使用媒体查询器(@media)或者js动态设置css,根据不同的手机屏幕宽度,适配不同手机,但是这样有个很大的缺点,那就是移动端的屏幕尺寸太多了,就得写很多代 ...

  10. jsonp应用

    1.服务端jsonp格式数据 如客户想访问 : http://www.runoob.com/try/ajax/jsonp.php?jsonp=callbackFunction. 假设客户期望返回JSO ...