Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式
观察者模式定义对象的一种一对多的依赖关系。当一个对象的状态发生改变时。全部依赖于它的对象都会得到通知并被自己主动更新。
一个简单的样例是。在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling),玩家能够在研究中心为它升级“肾上腺素”,升级之后,跳狗的攻击速度会翻倍。在这个模型中,我们能够看出。全部的跳狗都依赖于研究中心,当研究中心研究出肾上腺素后,通知每个跳狗单位,它们被迫进行自我更新——升级速度加倍。在观察者模型中。我们称研究中心为目标(Subject),而跳狗为观察者(Observer)。观察者观察目标的变化,假设目标发生了变化,那么观察者自身也会跟着变化。
下面是Java代码:
import java.util.ArrayList;
abstract class Subject{
ArrayList<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer){
if (!observers.contains(observer))
observers.add(observer);
}
public void detach(Observer observer){
if (observers.contains(observer))
observers.remove(observer);
}
protected void notifyObservers(){
for (Observer o : observers){
o.update(this);
}
}
}
abstract class Observer{
Subject subject;
public Observer(Subject subject){
this.subject = subject;
subject.attach(this);
}
abstract void update(Subject subject);
}
class AdrenalUpgrade extends Subject{
public void upgrade(){
notifyObservers();
}
}
class Zergling extends Observer {
public Zergling(Subject subject) {
super(subject);
}
public void update(Subject subject) {
if (subject == this.subject){
System.out.println("Zergling的肾上腺素被刺激,攻击速度翻倍。");
}
}
}
public class ObserverExample
{
public static void main(String[] args) {
AdrenalUpgrade adrenalUpgrade = new AdrenalUpgrade();
Zergling z1 = new Zergling(adrenalUpgrade);
Zergling z2 = new Zergling(adrenalUpgrade);
Zergling z3 = new Zergling(adrenalUpgrade);
Zergling z4 = new Zergling(adrenalUpgrade);
Zergling z5 = new Zergling(adrenalUpgrade);
Zergling z6 = new Zergling(adrenalUpgrade);
Zergling z7 = new Zergling(adrenalUpgrade);
adrenalUpgrade.upgrade();
}
}
Subject的是目标的基类,它能够attach或detach一个Observer。Subject含有一个List用于记录自己被哪些Observer依赖。当自身的状态改变时。会依次调用每个Observer的update()方法。
比如在main方法中,我们分别建立了z1、z2……z7共7个Zergling单位,它们都attach到了AdrenalUpgrade上,当AdrenalUpgrade调用了upgrade()时,会给每个Zergling发出通知,因此程序的执行结果为:
Zergling的肾上腺素被刺激,攻击速度翻倍!
Zergling的肾上腺素被刺激,攻击速度翻倍!
Zergling的肾上腺素被刺激,攻击速度翻倍!
Zergling的肾上腺素被刺激。攻击速度翻倍。
Zergling的肾上腺素被刺激。攻击速度翻倍!
Zergling的肾上腺素被刺激,攻击速度翻倍。
Zergling的肾上腺素被刺激,攻击速度翻倍。
以上就是观察者模式的一个样例。有兴趣的同学能够看一看MVC(C#)结构。它可能是观察者模式中最有名的结构之中的一个了。
Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式的更多相关文章
- Java 实现观察者(Observer)模式
1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...
- Head First 设计模式 —— 02. 观察者 (Observer) 模式
思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...
- 面向对象设计模式——观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- 设计模式之观察者(OBSERVER)模式
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...
- java观察者(Observer)模式
观察者模式: 试想,在电子商务网站上,一个用户看中了一件一份,但是当时衣服的价格太贵,你需要将衣服收藏,以便等衣服降价时自动通知该用户.这里就是典型的观察模式的例子. 1.观察者模式的 ...
- 《Head First 设计模式》ch.2 观察者(Observer)模式
观察者模式 定义了对象之间一对多以来,这样一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新 设计原则-松耦合 松耦合将对象之间的互相依赖降到了最低——只要他们之间的接口仍被遵守 观察者 ...
- 设计模式C++描述----04.观察者(Observer)模式
一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...
- 20. 星际争霸之php设计模式--适配器模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 17. 星际争霸之php设计模式--职责链模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
随机推荐
- [CodeForces522B] Photo to Remember
某一天,n个朋友在一起聚会,他们已经很久没见了,于是他们决定拍照留念. 简单的说,拍照的时候,每个人有一个高度和宽度,第i个的高度和宽度分别是hi和wi.这些人排成一条直线,照片的最小的面积必须包含所 ...
- springmvc 中将MultipartFile转为file,springboot 注入CommonsMultipartResolver
第一种方法: MultipartFile file = xxx; CommonsMultipartFile cf= (CommonsMultipartFile)file; DiskFileItem f ...
- 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。
练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类.Customer类将包含一个Account对象. 任务 在banking包下的创建Customer类 ...
- 【SQL】IN、EXISTS和表连接三者的效率比较
一. IN和EXISTS比较 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行查询.此时就会用到IN和EXISTS. 例如:查询departments表中存在的部门的人数. 1. 使 ...
- OpenCV: Kmeans的使用一维和二维点集
OpenCVKmeans算法默认使用了Kmeans++选取种子点 参考:OpenCv中Kmeans算法实现和使用 //效果:根据半径聚类,并不一定能得到好的结果. float CBlotGlint:: ...
- 图像局部显著性—点特征(SURF)
1999年的SIFT(ICCV 1999,并改进发表于IJCV 2004,本文描述):参考描述:图像特征点描述. 参考原文:SURF特征提取分析 本文有大量删除,如有疑义,请参考原文. SURF对SI ...
- JNI传递字符串数组J-StringArray
编译器对语言的转换以寻地址的方式进行序列化和反序列化,因此对于不固定类型或者不显示给出大小的对象不能直接解析,所以没有出现jstringArray这样的类型,只能一个一个编写. 参考链接:安卓开发提高 ...
- 利用node、express初始化项目
前端做整站是开发,例如:前端是用了vue创建初始化项目,后端我们不会php.java等,我们只能用node去创建去做后端代码,本文就给大家讲解最基础的从零开始创建一个项目的后端环境. 一般来说前后端代 ...
- react性能调谐与diff算法
一个页面其实就相当于是一颗dom树,里面有很多它的子节点,然后你每次去操作一个事件,它都会生成一个虚拟dom,它会跟上一个虚拟dom进行比对,这里运用的算法叫做diff算法,当它找到需要改变的组件的时 ...
- 09 Django组件之用户认证组件
没有学习Django认证组件之前使用装饰器方法 from django.shortcuts import render, HttpResponse, redirect from app01.MyFor ...