一、定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。主要应用在java的AWT事件机制。

二、角色

  • 抽象主题角色(Subject):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
  • 具体主题角色(RealSubject):在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
  • 抽象观察者角色(Observer):为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
  • 具体观察者角色(RealObserver):该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用,通常用一个子类实现。

三、代码演示

抽象观察者角色(Observer)

/**
* 抽象观察者角色
* @author zhangkang
*
*/
public interface MyObserver {
void update(String message,String subjectName);
}

具体观察者角色1(RealObserver1)

/**
* 具体观察者1
* @author zhangkang
*
*/
public class RealObserver1 implements MyObserver{ private String name; public RealObserver1(String name) {
this.name = name;
} @Override
public void update(String message, String subjectName) {
System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
}
}

具体观察者角色2(RealObserver2)

/**
* 具体观察者2
* @author zhangkang
*
*/
public class RealObserver2 implements MyObserver{ private String name; public RealObserver2(String name) {
this.name = name;
} @Override
public void update(String message, String subjectName) {
System.out.println(name + ":【我收到了来自" + subjectName + "的信息,信息内容为:" + message + "】");
}
}

抽象主题角色(Subject)

/**
* 抽象主题角色
* @author zhangkang
*
*/
public interface MySubject {
void addObserver(MyObserver o); //添加观察者
void deleteObserver(MyObserver o); //删除观察者
void notifyObservers(String message); //通知所有的观察者
}

具体主题角色(RealSubject)

import java.util.ArrayList;
import java.util.List;
/**
* 具体主题
* @author zhangkang
*
*/
public class RealSubject implements MySubject{ private String subjectName = "官方"; //主题名称 private List<MyObserver> list; //集合用来保存每个观察者 public RealSubject() {
list = new ArrayList<MyObserver>();
} @Override
public void addObserver(MyObserver o) {
list.add(o);
} @Override
public void deleteObserver(MyObserver o) {
list.remove(o);
} @Override
public void notifyObservers(String message) {
for (MyObserver myObserver : list) {
myObserver.update(message, subjectName);
}
}
}

客户端测试

/**
* 客户端测试
* @author zhangkang
*
*/
public class Test {
public static void main(String[] args) {
//定义两个观察者
MyObserver o1 = new RealObserver1("段友1");
MyObserver o2 = new RealObserver2("段友2"); //定义一个主题
MySubject subject = new RealSubject();
//添加观察者
subject.addObserver(o1);
subject.addObserver(o2);
//发布消息通知观察者
subject.notifyObservers("内涵段子TV已下架!");
}
} 输出:
段友1:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】
段友2:【我收到了来自官方的信息,信息内容为:内涵段子TV已下架!】

Java观察者模式(Observer)的更多相关文章

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

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

  2. [Android&amp;Java]浅谈设计模式-代码篇:观察者模式Observer

    观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个 ...

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

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

  4. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  5. java: 观察者模式:Observable被观察者,Observer观察者

    java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...

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

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

  7. Java观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  8. java观察者模式

      像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

  9. C# ~ 从 委托事件 到 观察者模式 - Observer

    委托和事件的部分基础知识可参见 C#/.NET 基础学习 之 [委托-事件] 部分: 参考 [1]. 初识事件 到 自定义事件: [2]. 从类型不安全的委托 到 类型安全的事件: [3]. 函数指针 ...

随机推荐

  1. 《深入理解java虚拟机》笔记(6)内存分配与回收策略

    一.垃圾回收日志说明 [GC[DefNew: 7307K->494K(9216K), 0.0043710 secs] 7307K->6638K(19456K), 0.0044894 sec ...

  2. CSS布局技巧之——各种居中

    居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...

  3. Android studio 3.1.1 找不到DDMS

    先找到AndroidStudio配置的SDK路径: 在SDK的/tools/路径下[就是和配置ADB一样的路径]有个monitor.bat 的批处理文件: 鼠标连续点击两下monitor.bat这个批 ...

  4. BaseAdapter获取View之三重境界

    在BaseAdapter获取View之前,BaseAdapter需要与数据源相关联. 可以使用构造方法: private List<ItemBean> baseListItems; pri ...

  5. pc端常见布局---垂直居中布局 单元素不定高

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. js修改文档的样式

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Java ...

  7. HDU 1007 Quoit Design最近点对( 分治法)

    题意: 给出平面上的n个点,问任意点对之间的最短距离是多少? 思路: 先将所有点按照x坐标排序,用二分法将n个点一分为二个部分,递归下去直到剩下两或一个点.对于一个部分,左右部分的答案分别都知道,那么 ...

  8. 洛谷 P1145 约瑟夫

    题目描述 n个人站成一圈,从某个人开始数数,每次数到m的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人.现在有一圈人,k个好人站在一起,k个坏人站在一起.从第一个好人开始数数.你要确定一个最小 ...

  9. Android(java)学习笔记134:Android数据存储5种方式总结

    1.使用文件(File)存储 存储一般的数据 2.使用sharedperference(xml) 存储设置信息.配置信息.密码 3.数据库Sqlite 开源的,嵌入式的数据库,轻量级 4.使用Cont ...

  10. 2004: C语言实验——数日子(数组)

    2004: C语言实验——数日子 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 213  Solved: 111[Submit][Status][Web ...