观察者模式由四个角色组成:抽象主题角色,抽象观察者角色,具体主题角色,抽象观察者角色,具体观察者角色

抽象主题角色(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)的更多相关文章

  1. 十一个行为模式之观察者模式(Observer Pattern)

    定义: 定义对象之间一种一对多的关系,当被观察者状态变化时,可以自动地通知观察者并执行相关的业务操作.观察者模式又被称为发布-订阅模式等. 结构图: Subject:抽象主题类,定义了所有被观察类的通 ...

  2. 设计模式----行为型模式之观察者模式(Observer Pattern)

    下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...

  3. 面向对象设计模式--观察者模式(Observer)

    要点: 1.如何使用观察者模式: 对应使用这个模式的用户(main)来说,subject和observer这两个基类是不被关系的,在调用者(main)中只是有concreteSubject和concr ...

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

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

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

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

  6. 反应器模式 vs 观察者模式

    反应器模式(Reactor pattern)与观察者模式(Observer pattern) 反应器模式 是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式.当请求抵达后,服务处理程 ...

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

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

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

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

  9. Java 设计模式系列(十五)观察者模式(Observer)

    Java 设计模式系列(十五)观察者模式(Observer) Java 设计模式系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Java ...

随机推荐

  1. PHP+Mysql+jQuery实现地图区域数据统计-展示数据

    我们要在地图上有限的区块内展示更多的信息,更好的办法是通过地图交互来实现.本文将给大家讲解通过鼠标滑动到地图指定省份区域,在弹出的提示框中显示对应省份的数据信息.适用于数据统计和地图区块展示等场景. ...

  2. sql sever笔记 日期时间

     SET DATEFORMAT 的设置是在执行或运行时设置,而不是在分析时设置. SET DATEFORMAT 将覆盖 SET LANGUAGE 的隐式日期格式设置. 该设置仅用在将字符串转换为日期值 ...

  3. [转]Django与遗留系统和数据库集成

    From:http://www.czug.org/python/django/17.html 尽管Django最适合从零开始开发项目--所谓的"绿色领域"开发--将框架与遗留系统和 ...

  4. 数据挖掘之决策树ID3算法(C#实现)

    决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般 ...

  5. 获取layer.open弹出层的返回值

    正在开发的车联网项目用到了layer API.当我在开发“新建电子围栏”的时候需要弹出地图,用户在地图中画一个区域,最后将这个弹出层的数据返回给原页面.下面是我的实现过:程: 触发弹出层的代码: la ...

  6. 安装lua和openresty

    #### ubuntu 16.04 64bit 安装Lua luajit 及openresty 1 安装lua ,因为luajit 支持lua5.1较好.貌似不支持5.2和5.3作为学习,我就安装5. ...

  7. MySQL5.7安装与配置(YUM)

    安装环境:CentOS7 64位,MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/  # ...

  8. jQuery MiniUI开发系列之:数据验证

    在开发应用系统界面时,往往需要进行很多.复杂的数据验证,当填写的数据符合规定,才能提交保存. jQuery MiniUI提供了比较完美的表单数据验证和错误显示的方式. 常见的表单控件,都有一个验证事件 ...

  9. OpenCV的数据类型---Cv

    CvScalar就是一个包含四个元素的结构体变量. CvScalar定义可存放1—4个数值的数值,其结构如下. typedef struct CvScalar{    double val[4];}C ...

  10. mvc4 发布,遇到 403.14 问题,并且iis提示打开目录浏览。。。解决办法

    经测试,只需要在web.config的system.web的同级节点,添加如下代码,即可完美运行.原理参考文章:一.<validation validateIntegratedModeConfi ...