1、定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式又叫发布-订阅(Publish/Subscribe)模式。

2、观察者模式的四种基本角色

  • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
  • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,向所有登记过的观察者发出通知。
  • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

3、示例程序

(以一个游戏玩家和游戏管理员为例,游戏管理员为被观察者,游戏玩家为观察者,当游戏维护了,游戏管理员会通知每一位玩家“游戏维护中,2小时后恢复”,游戏恢复后再通知每一位玩家“游戏恢复正常,可以游戏了”)

1)抽象被观察者

public interface IGameAdmin {
void addGamePlayer(IGamePlayer iGamePlayer);
void removeGamePlayer(IGamePlayer iGamePlayer);
void notifyAllGamePlayer();
void setGameMessage(String message);
}

2)抽象观察者

public interface IGamePlayer {
void updateMessage(String message);
}

3)具体被观察者

public class GameAdmin implements IGameAdmin {

    //注意集合里面存的是抽象观察者,这样是为了以后观察者和被观察者解耦,每一方的具体角色的改变不影响另一方
private List<IGamePlayer> gamePlayers;
private String message; public GameAdmin(){
gamePlayers = new ArrayList<IGamePlayer>();
} public void addGamePlayer(IGamePlayer iGamePlayer) {
gamePlayers.add(iGamePlayer);
} public void removeGamePlayer(IGamePlayer iGamePlayer) {
gamePlayers.remove(iGamePlayer);
} public void notifyAllGamePlayer() {
for(IGamePlayer iGamePlayer:gamePlayers){
iGamePlayer.updateMessage(message);
}
} /**
* 当游戏管理员的消息发生变化时,通知所有已经注册的游戏玩家
* @param message
*/
public void setGameMessage(String message){
this.message = message;
notifyAllGamePlayer();
}
}

4)具体观察者

public class GamePlayer implements IGamePlayer {

    private String name;

    public GamePlayer(String name) {
this.name = name;
} public void updateMessage(String message) {
System.out.println(name + " 收到游戏管理员消息:" + message);
}
}

5)测试类

public class Test {
public static void main(String[] args){
IGameAdmin iGameAdmin = new GameAdmin();
IGamePlayer iGamePlayer1 = new GamePlayer("张三");
IGamePlayer iGamePlayer2 = new GamePlayer("李四");
IGamePlayer iGamePlayer3 = new GamePlayer("王五");
iGameAdmin.addGamePlayer(iGamePlayer1);
iGameAdmin.addGamePlayer(iGamePlayer2);
iGameAdmin.addGamePlayer(iGamePlayer3);
System.out.println("游戏发生了故障");
iGameAdmin.setGameMessage("游戏维护中,2小时后恢复");
iGameAdmin.removeGamePlayer(iGamePlayer2);
System.out.println("游戏恢复后");
iGameAdmin.setGameMessage("游戏恢复正常,可以游戏了"); }
}
游戏发生了故障
张三 收到游戏管理员消息:游戏维护中,2小时后恢复
李四 收到游戏管理员消息:游戏维护中,2小时后恢复
王五 收到游戏管理员消息:游戏维护中,2小时后恢复
游戏恢复后
张三 收到游戏管理员消息:游戏恢复正常,可以游戏了
王五 收到游戏管理员消息:游戏恢复正常,可以游戏了

java常用设计模式四:观察者模式的更多相关文章

  1. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

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

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

  3. JAVA的设计模式之观察者模式----结合ActiveMQ消息队列说明

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

  4. JAVA常用设计模式(静态化调用和实例化调用的区别,编辑可见 )

    用newInstance()与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类,且newInstance()只能调用无参构造函数. 最大的区别在于内存.静态方法 ...

  5. Java常见设计模式之观察者模式

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

  6. JAVA基础——设计模式之观察者模式

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...

  7. Java设计模式16:常用设计模式之观察者模式(行为型模式)

    1. Java之观察者模式(Observer Pattern) (1)概述: 生活中我们在使用新闻app,当我们对某一栏比较感兴趣,我们往往会订阅这栏新闻,比如我对军事栏感兴趣,我就会订阅军事栏的新闻 ...

  8. java常用设计模式

    一个程序员对设计模式的理解: "不懂"为什么要把很简单的东西搞得那么复杂. 后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所在,我 ...

  9. JAVA常用设计模式整理

    设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...

随机推荐

  1. mac上将代码上传到github

    前言 有时我们会写一些小程序来学习新的知识,但是完事之后过一段时间可能会忘记,最好的办法就是找到原来的代码看一看.现在可以将代码免费托管到一些网站上,其中最著名的非github莫属了, 今天就把这个过 ...

  2. f5负载均衡算法

    负载均衡使用一种算法或公式来确定由哪一个后台服务器接收流量 负载均衡是基于连接的 1.静态负载均衡算法:以固定方式分发连接 轮询算法(Round Robin):将请求依次顺序循环地分发给服务器,从1到 ...

  3. Django的rest_framework的序列化组件之序列化多表字段的方法

    首先,因为我们安装了restframework,所以我们需要在django的settings中引入restframework INSTALLED_APPS = [ 'django.contrib.ad ...

  4. 音频 PCM 数据的采集和播放

    PCM(Pulse Code Modulation)脉冲编码调制 —— 音频的采集与量化过程. PCM数据是最原始的音频数据完全无损,所以PCM数据虽然音质优秀但体积庞大. 为了解决这个问题先后诞生了 ...

  5. git add 文件夹

    1. 本地新建好文件夹,在文件夹里新建*.md 2. 切换到文件夹父目录 3. git add 文件夹名 4. git commit 5. git push

  6. 配置go语言编辑环境 - goland

    快捷键: 移动行 Alt + Shift + up/down 行内(选中)移动(到头尾/删除) Ctrl(Shift) + left/rignt(Home/End/Backspace) 插入新行 Sh ...

  7. select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表

    好久没有写过Sql了,今天遇到一个问题,业务逻辑是: 一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号. 这样我 ...

  8. 完全卸载jdk

    完全卸载jdk  如(卸载jdk1.7.0_80),  当卸载jdk时出现删除信息不全,导致无法安装,可通过此方法实现完全卸载. 1.打开系统运行输入regedit(注册表)分别查找以下路径  (1) ...

  9. 10.9h5日记

    一.单位 1.px是基本的单位,像素 2.em也是一个单位,使用方式,用元素父级的字体大小乘以em前的数字,父级没有就向上一个父级找, 直到body为止,如果body没有,就用默认的字体大小16px ...

  10. http协议(四)http常用状态码

    一:http状态码 表示客户端http请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作 状态码的类别如下: http状态码种类繁多,大概有60多种,实际上经常使用的只有14种,下面为一 ...