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. TZOJ 二分图练习

    二分图主要是 1.如何建图,谁匹配谁,怎么匹配 2.判断求的是什么:最大匹配=最小点覆盖,最大独立子集=最小路径覆盖=最小边覆盖=图中顶点数-最大匹配 A.2733:棋盘游戏 描述 小希和Gardon ...

  2. php中时间转换函数

    date("Y-m-d H:i",$unixtime)  1.php中获得今天零点的时间戳 要获得零点的unix时间戳,可以使用 $todaytime=strtotime(“tod ...

  3. ceil,floor,trunc,round,sign几个函数在SQL的使用方法

    只是在oracle的环境下进行的几个数的测试,在这里只是举例说明,没有理论说明,抱歉. select ceil(1.8) from dual; --结果为1,向上取整select floor (1.8 ...

  4. ie8,9不支持indexOf解决办法,纯拷贝

    原文在这里,大家快去点啊 自从开始工作后,就没有再碰过原型链了,今天遇到ie8不认识indexOf的时候才发现原型这么嚣张,,哈哈 把代码粘过来,以后留着看 //添加数组IndexOf方法 if (! ...

  5. InstallShield 2015 安装 在vs2015

     网上很少注册InstallShield 2015  的方法,而且很多以前版本的注册也很笼统,今天我就说说几个细节上的问题.相信大家看了会有帮助,有问题回帖,我会及时跟上, 先说说我遇到的问题 安装: ...

  6. yum 安装 php7 ,lamp ,以及安装swoole

    1 更新yum yum update 2 安装依赖 yum -y install pcre* openssl* yum -y install gcc make gd-devel libjpeg-dev ...

  7. node.js 关于 async的使用

    第一次使用,感觉有点糊涂,后来实验明白了. 在串行执行中,经常会只做了第一步.后来明白了.是没有把回调函数放在里面简单就是:  async.series(                 {     ...

  8. Yii2 数据操作Query Builder查询数据

    Query Builder $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name']) ->from('zs_dynast ...

  9. MVC 第一章(下)

    继续第一章 用Javascript and jQuery调用Web API 在上一节,我们用浏览器直接调用web API.但是大多数web API被客户端应用以编程的方式调用.那么我们写一个简单的ja ...

  10. Ubuntu12.04软件安装指南

    更新升级源 首先编辑软件源,在终端输入下面命令: sudo gedit /etc/apt/sources.list 较快速的升级源有163,台湾源,科大源,搜狐源等,大家将新的升级源全部覆盖原文件so ...