观察者模式又叫做订阅/发布模式

  • 一个Subject,多Observer
  • 相互之间持有引用
  • Subject可以调用Observer的函数执行相应操作
  • Observer发生变动时也可以通知Subject让其通知其他观察者。

给个小栗子(效果图如下)

目标被观察者

 1 package ObserverPattern;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 public abstract class Subject {
 7
 8     //define an ArrayList to store observers
 9     private List<Observer>  observers = new ArrayList<>();
10     public List<Observer> getObservers() {
11         return observers;
12     }
13
14
15     public void join(Observer observer) {
16         observers.add(observer);
17     }
18
19     public void quit(Observer observer) {
20         observers.remove(observer);
21     }
22
23     public abstract void notifyObservers(String name);
24
25 }

View Code

观察者

package ObserverPattern;public abstract class Observer {protected Subject subject;public Observer(Subject subject) {this.subject = subject;}public abstract void sysMsg(String msg);public abstract void beAttacked();public abstract String getName();public abstract void setName(String name);
}

View Code

战况指挥中心

package ObserverPattern;public class ActionControlCenter extends Subject {@Overridepublic void notifyObservers(String name) {for (Observer observer : getObservers()) {if (name.equals(observer.getName()))observer.sysMsg(observer.getName() +"收到消息:坚持住,你队友正在赶来!");elseobserver.sysMsg(observer.getName() +"收到消息:我方\"" + name + "\"正在受到攻击,请尽快支援!");}}
}

View Code

玩家

package ObserverPattern;public class Player extends Observer {public Player(Subject subject) {super(subject);}private String name;public void setName(String name) {this.name = name;}public String getName() {return name;}@Overridepublic void beAttacked() {System.out.println(getName() + "收到消息:您正在受到攻击!");subject.notifyObservers(getName());}@Overridepublic void sysMsg(String msg) {System.out.println(msg);}
}

View Code

测试用例

package ObserverPattern;import org.junit.Test;public class MainTest {@Testpublic void myTest() {ActionControlCenter controlCenter = new ActionControlCenter();Player p1 = new Player(controlCenter);Player p2 = new Player(controlCenter);p1.setName("邓艾");p2.setName("甄姬");controlCenter.join(p1);controlCenter.join(p2);p2.beAttacked();}}

转载于:https://www.cnblogs.com/webyyq/p/9102017.html

观察者模式(Observer Pattern)相关推荐

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

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

  2. 设计模式-观察者模式(Observer Pattern)

    设计模式-观察者模式 观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应.在观察者模式中,发生改变的对象称为观 ...

  3. 设计模式 -行为型模式_ 观察者模式Observer Pattern 之 JDK内置的实现

    文章目录 概念 Code [主题] [观察者s] 观察者一 观察者二 [测试] 源码分析 java.util.Observable 目标类 java.util.Observer 观察者接口 notif ...

  4. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  5. 极速理解设计模式系列:2.观察者模式(Observer Pattern)

    4个角色:被观察者(Subject/目标对象接口),具体被观察者(ConcreteSubject/具体目标对象),观察者(Observer),具体观察者(ConcreteObserver)       ...

  6. 锈才学设计模式之 —— 观察者模式(Observer Pattern)

    锈才学设计模式之  -- 观察者模式 观察者模式:定义对象的一对多的关系,这样当主题对象改变状态时,其它的观察者对象都会收到通知,自动更新. 说明: 在真实世界中存在很多类似的模型,比如:订报纸,找中 ...

  7. Java设计模式—观察者模式(Observer pattern)

    故事: 小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出.男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追 ...

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

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  9. 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现

    1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject {publi ...

  10. 观察者模式-Observer Pattern

    1.主要优点 观察者模式的主要优点如下: (1) 观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色. (2) ...

最新文章

  1. android Canvas 最基础知识总结
  2. 为什么数据库不应该使用外键
  3. Python开发服务器巡检系统,东拼西凑用python脚本登录web管理页面做巡检(未实现)...
  4. Why am I getting this error “Expected resource of type raw” in Android Studio?
  5. Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面
  6. 手脱FSG 2.0 - bart/xt
  7. 【CoppeliaSim】远程 API 之 Matlab 控制,对比 V-rep 有些不同
  8. 迭代器: isinstance
  9. Python | 展示一个break语句示例
  10. 987. 二叉树的垂序遍历
  11. Python中的缩进(unindent)问题
  12. 解决bmp图片文件宽度不是4的倍数
  13. 看名言后的心得体会学会融会贯通
  14. 163vip邮箱账号登录入口在哪儿?163邮箱登录不了怎么办?
  15. GIS与虚拟仿真下直观、完整、立体地园区实景展示
  16. Ubuntu 14.04 配置 Java SE jdk-7u55
  17. ps cs6 mac破解方法
  18. 转载 | 访问控制是什么?数据安全的关键组成
  19. 计算机毕业设计JavaBS景区票务管理系统设计与实现(源码+系统+mysql数据库+lw文档)
  20. 基础连接已经关闭: 接收时发生意外错误

热门文章

  1. Linux内存管理原理【转】
  2. 颜色空间转换 cvtColor()[OpenCV 笔记13]
  3. 实验mongodb使用gridfs存放一个大文件
  4. JDBC(与Orcale的连接)(转)
  5. android application 引起内存泄漏的原因
  6. jq 创建与添加节点
  7. gSOAP 在windows下的安装与使用(mingw32)
  8. DOS 如何取当前时间做为文件名?
  9. 【Splay】洛谷3372 【模板】线段树 1
  10. [Js/Jquery]jquery插件开发