博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-观察者模式
阅读量:6970 次
发布时间:2019-06-27

本文共 2723 字,大约阅读时间需要 9 分钟。

hot3.png

来源:《设计模式之禅》

定义:观察者模式也叫订阅者模式。定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖他的对象都会得到通知并更新状态。

观察者角色:

  1. Subject 被观察者:定义被观察者的职责,动态的新增,删除观察者。

  2. ConcreteSubject 具体被观察者:实现Subject。

  3. observer 观察者:定义观察者结束消息和状态更新的方法。

  4. ConcreteObserver 具体观察者:实现observer 观察者定义。

类图:

193205_pMzS_733161.png

代码:

抽象主题,被观察者

/** *  */package cc.rico.pattern.observe;/** * @author rico * 抽象主题,被观察者 */public interface Subject {		/**	 * 添加观察者	 * @param observer	 */	public void add(Observer observer);		/**	 * 删除观察者	 * @param observer	 */	public void remove(Observer observer);		/**	 * 发送消息给观察者	 */	public void messageNotify();}

具体主题

/** *  */package cc.rico.pattern.observe;import java.util.Vector;/** * @author rico * 具体主题 */public class ConcreteSubject implements Subject {	private Vector
 vector = new Vector
(); /* (non-Javadoc)  * @see cc.rico.pattern.observe.Subject#add(cc.rico.pattern.observe.Observer)  */ @Override public void add(Observer observer) { vector.add(observer); } /* (non-Javadoc)  * @see cc.rico.pattern.observe.Subject#remove(cc.rico.pattern.observe.Observer)  */ @Override public void remove(Observer observer) { vector.remove(observer); } /* (non-Javadoc)  * @see cc.rico.pattern.observe.Subject#messageNotify()  */ @Override public void messageNotify() { for(Observer item : vector) { item.action("###具体主题发送消息..."); } }}

抽象观察者

/** *  */package cc.rico.pattern.observe;/** * @author rico * 抽象观察者 */public interface Observer {		/**	 * 观察内容	 * @param context	 */	public void action(String context);}

具体观察者

/** *  */package cc.rico.pattern.observe;/** * @author rico * 具体观察者 */public class ConcreteObserver1 implements Observer {	/* (non-Javadoc)	 * @see cc.rico.pattern.observe.Observer#action(java.lang.String)	 */	@Override	public void action(String context) {		System.out.println("###ConcreteObserver1.action");		System.out.println("接收的消息:" + context);	}}

/** *  */package cc.rico.pattern.observe;/** * @author rico * 具体观察者 */public class ConcreteObserver implements Observer {	/* (non-Javadoc)	 * @see cc.rico.pattern.observe.Observer#action(java.lang.String)	 */	@Override	public void action(String context) {		System.out.println("###ConcreteObserver.action");		System.out.println("接收的消息:" + context);	}}

场景类:

/** *  */package cc.rico.pattern.observe;/** * @author rico * 场景类 */public class Client {	/**	 * @param args	 */	public static void main(String[] args) {		Observer ob1 = new ConcreteObserver();		Observer ob2 = new ConcreteObserver1();				Subject subject = new ConcreteSubject();		subject.add(ob1);		subject.add(ob2);				subject.messageNotify();	}}

观察者模式优点:

  1. 被观察者和观察者之间是抽象耦合,易于扩展。

  2. 建立一套触发机制。

观察者模式缺点:

     观察者模式需要考虑一下开发效率和运行效率问题,一个被观察者,多个观察者,开发和调试会比较复杂。

使用场景:

  1. 关联行为场景。

  2. 事件多级触发。

  3. 夸系统的消息交互。

扩展:

转载于:https://my.oschina.net/u/733161/blog/525632

你可能感兴趣的文章
kafka & zookeeper 4/12/2016
查看>>
WSFC2016 诊断排错更新
查看>>
新建ORACLE数据库实例时ORA-12154: TNS: 无法解析指定的连接标识符的解决
查看>>
nginx-1.10.3部署正向代理
查看>>
并发编程六之同步
查看>>
医院网络咨询法则——打太极应对异议访客的各种提问
查看>>
nobelking 1 Tomcat 80端口号被占用
查看>>
卸载阿里云的服务
查看>>
windows server 2003 分区扩容
查看>>
redis设置密码
查看>>
基于flash cs3 actionscript3.0的mp3网络播放器
查看>>
webJSP倒计时
查看>>
.[转] 心情不好的时候,看这10部励志短片…… 2012-5-29 15:49阅读(12)转...
查看>>
RHEL7.0 防火墙入门
查看>>
WordPress 伪静态规则(Apache/Nginx)
查看>>
修改从自动补全文本下拉列表获取的内容
查看>>
虚拟化——使用模板和克隆虚拟机
查看>>
lsof有一把利器
查看>>
Redis消息通知系统的实现
查看>>
XEN虚拟机复制
查看>>