观察者模式(Observer Pattern)
观察者模式又叫做订阅/发布模式
- 一个Subject,多Observer
- 相互之间持有引用
- Subject可以调用Observer的函数执行相应操作
- Observer发生变动时也可以通知Subject让其通知其他观察者。
给个小栗子(效果图如下)
目标被观察者
![](/assets/blank.gif)
![](/assets/blank.gif)
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
观察者
![](/assets/blank.gif)
![](/assets/blank.gif)
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
战况指挥中心
![](/assets/blank.gif)
![](/assets/blank.gif)
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
玩家
![](/assets/blank.gif)
![](/assets/blank.gif)
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)相关推荐
- 设计模式 - 观察者模式(Observer Pattern) Java内置 用法
观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...
- 设计模式-观察者模式(Observer Pattern)
设计模式-观察者模式 观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应.在观察者模式中,发生改变的对象称为观 ...
- 设计模式 -行为型模式_ 观察者模式Observer Pattern 之 JDK内置的实现
文章目录 概念 Code [主题] [观察者s] 观察者一 观察者二 [测试] 源码分析 java.util.Observable 目标类 java.util.Observer 观察者接口 notif ...
- 设计模式学习--观察者模式(Observer Pattern)
设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热! 下午15:28 设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...
- 极速理解设计模式系列:2.观察者模式(Observer Pattern)
4个角色:被观察者(Subject/目标对象接口),具体被观察者(ConcreteSubject/具体目标对象),观察者(Observer),具体观察者(ConcreteObserver) ...
- 锈才学设计模式之 —— 观察者模式(Observer Pattern)
锈才学设计模式之 -- 观察者模式 观察者模式:定义对象的一对多的关系,这样当主题对象改变状态时,其它的观察者对象都会收到通知,自动更新. 说明: 在真实世界中存在很多类似的模型,比如:订报纸,找中 ...
- Java设计模式—观察者模式(Observer pattern)
故事: 小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出.男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追 ...
- 设计模式(行为型)之观察者模式(Observer Pattern)
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现
1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject {publi ...
- 观察者模式-Observer Pattern
1.主要优点 观察者模式的主要优点如下: (1) 观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色. (2) ...
最新文章
- android Canvas 最基础知识总结
- 为什么数据库不应该使用外键
- Python开发服务器巡检系统,东拼西凑用python脚本登录web管理页面做巡检(未实现)...
- Why am I getting this error “Expected resource of type raw” in Android Studio?
- Spring Boot 2.x基础教程:使用 Thymeleaf开发Web页面
- 手脱FSG 2.0 - bart/xt
- 【CoppeliaSim】远程 API 之 Matlab 控制,对比 V-rep 有些不同
- 迭代器: isinstance
- Python | 展示一个break语句示例
- 987. 二叉树的垂序遍历
- Python中的缩进(unindent)问题
- 解决bmp图片文件宽度不是4的倍数
- 看名言后的心得体会学会融会贯通
- 163vip邮箱账号登录入口在哪儿?163邮箱登录不了怎么办?
- GIS与虚拟仿真下直观、完整、立体地园区实景展示
- Ubuntu 14.04 配置 Java SE jdk-7u55
- ps cs6 mac破解方法
- 转载 | 访问控制是什么?数据安全的关键组成
- 计算机毕业设计JavaBS景区票务管理系统设计与实现(源码+系统+mysql数据库+lw文档)
- 基础连接已经关闭: 接收时发生意外错误