编程模式之观察者模式(Observer)
观察者模式由四个角色组成:抽象主题角色,抽象观察者角色,具体主题角色,抽象观察者角色,具体观察者角色。
抽象主题角色(Subject):把所有的观察者角色的引用保存在一个集合中,可以有任意数量的观察者。其提供一个接口,可以添加、删除观察者,并可以向登记过的观察者发送通知。
具体主题角色(Observer):实现了抽象主题角色提供的接口的一个具体类。
抽象观察者角色(ConcreteSubject):提供一个借口,以接收主题角色发送的通知。
具体观察者角色(ConcreteObserver):实现了抽象观察者角色提供的接口的一个具体类。
类图

JAVA代码:
package com.observer; import java.util.ArrayList;
import java.util.List; /**
* 抽象主题角色,被观察
* @author hyp
*
*/
public interface Subject
{
void addWatcher(Watcher watcher);
void removeWatcher(Watcher watcher);
void notify(String message);
} /**
* 抽象观察者角色,观察主题
* @author hyp
*
*/
public interface Watcher
{
void update(String message);
} /**
* 具体主题角色
* @author hyp
*
*/
public class ConcreteSubject implements Subject
{
private List<Watcher> watchers = new ArrayList<Watcher>(); @Override
public void addWatcher(Watcher watcher)
{
watchers.add(watcher);
} @Override
public void removeWatcher(Watcher watcher)
{
watchers.remove(watcher);
} @Override
public void notify(String message)
{
for(Watcher w:watchers)
{
w.update(message);
}
}
} /**
* 具体观察者橘色
* @author hyp
*
*/
public class ConcreteWatcher implements Watcher
{ @Override
public void update(String message)
{
System.out.println(this.toString()+ ":" + message);
}
} /**
* 测试观察者模式
* @author hyp
*
*/
public class Test
{
public static void main(String[] args)
{
Subject subject= new ConcreteSubject();
Watcher watcher1 = new ConcreteWatcher();
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher(); Subject.addWatcher(watcher1);//添加观察者
Subject.addWatcher(watcher2);
Subject.addWatcher(watcher3); Subject.notify("Hello");//通知所有观察者 Subject.removeWatcher(watcher1);//移除一个观察者 Subject.notify("bye~"); }
}
编程模式之观察者模式(Observer)的更多相关文章
- 十一个行为模式之观察者模式(Observer Pattern)
定义: 定义对象之间一种一对多的关系,当被观察者状态变化时,可以自动地通知观察者并执行相关的业务操作.观察者模式又被称为发布-订阅模式等. 结构图: Subject:抽象主题类,定义了所有被观察类的通 ...
- 设计模式----行为型模式之观察者模式(Observer Pattern)
下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...
- 面向对象设计模式--观察者模式(Observer)
要点: 1.如何使用观察者模式: 对应使用这个模式的用户(main)来说,subject和observer这两个基类是不被关系的,在调用者(main)中只是有concreteSubject和concr ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- 反应器模式 vs 观察者模式
反应器模式(Reactor pattern)与观察者模式(Observer pattern) 反应器模式 是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式.当请求抵达后,服务处理程 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- Java 设计模式系列(十五)观察者模式(Observer)
Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...
随机推荐
- table中bordercolor属性设置后最新ie浏览器或firefox中不显示边线,借助table的css来实现边线
table中的bordercolor属性设置后在最新的ie或者firefox中均不显示边线,table的边线又是常用功能.只能使用css来实现了,更通用,更方便一些. css: .ctable{ b ...
- Apache Shiro 简单概念
Apache Shiro 是ASF旗下的一款开源软件(Shiro发音为"shee-roh",日语"堡垒(Castle)"的意思),提供了一个强大而灵活的安全框架 ...
- 手机平板等移动端适配跳转URL的js代码
<script type="text/javascript"> if(/AppleWebKit.*mobile/i.test(navigator.userAgent) ...
- contains 方法
不管在c#中还是java中,很多类型都有contains方法.它的原理是什么? 看一个java的例子 http://blog.csdn.net/fwwdn/article/details/674684 ...
- PL/SQLDeveloper导入导出Oracle数据库方法
前一篇博客介绍了Navicat工具备份Oracle的方法,这篇博客介绍一下使用PL/SQL Developer工具导入导出Oracle数据库的方法. PL/SQL Developer是Oracle数据 ...
- centos 安装 python2.7 运行webpy 项目
1.服务器是centos5,在virtualbox里装的.网络选择桥接,ip与主机在一个网段类.主机ip为xxx.xxx.xxx.69,服务器ip定义为xxx.xxx.xxx.66,GATEWAY与N ...
- Silverlight ComboBox with TreeView
本代码根据国外同名控件代码修改而来--对于N-Tier项目,要求数据源都实现一个接口显然很不方便,因此做了如下修改: 删除接口定义及相关代码 增加了DisplayMember属性,用于标明在Combo ...
- jsoncpp初使用
一 前言 由于最近一个c++项目需要使用json这种数据格式来传输数据, so上网去寻找合适的类库,毕竟对于这种不是很新的技术, 自己造轮子有点得不偿失. 从百度上翻了翻, 基本上就boost跟jso ...
- 同时闪烁多个要素代码(ArcEngine)
/// <summary> /// 根据查询条件构造/// </summary> /// <param name="where">查询条件< ...
- python Queue模块
先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...