`

观察者模式和模拟wow插件的例子

阅读更多
观察者模式的定义:在对象之间定义一对多的依赖,当一个对象改变状态时,依赖它的对象都会收到通知,并自动更新。

说白了就像是:有一群人订了同一家报纸,当这个报纸出新版的时候,会派报童给每个订阅了自己的人一份最新的报纸,然后不同的订阅人收到报纸后,自己处理,可以看看新闻,可以叠成飞机,可以用来防止上厕所时没带纸。。。订阅者收到报纸后怎么样,已经不管这家报纸发行商的事了。
订阅人可以取消订阅,没订阅的人也可以加入订阅的行列。

WOW扫盲,写给没玩过WOW的java人们:
WOW:魔兽世界
BOSS:这个大家都知道,每个游戏都有BOSS,就是个怪物的首领
TANK:也就是大家常说的肉盾,把BOSS的仇恨吸引到自己身上来,好让其他人打BOSS
DPS:打手,BOSS打TANK,DPS打BOSS
Healther:治疗,俗称奶妈,BOSS打TANK,奶妈给TANK加血。


现在用这种模式来模拟一个WOW的插件。
假设,WOW中有一个BOSS,他的技能分两个阶段。
第一阶段的时候,只用TANK拉好了,DPS们只管打就是了,奶妈治疗TANK。
第二阶段的时候,BOSS会在地面上方火焰,TANK依然是拉好BOSS,但需要躲地上的火焰,DPS们依然是打BOSS,也需要躲火焰,奶妈这个时候不但要为TANK加血,也要为DPS加血(有的DPS可能被火烧到)。

我们要做的东西,就是为队长写一个插件,让这个插件可以自动给队里的每个角色分配任务。
我们希望BOSS在第一阶段的时候,奶妈可以自动收到一个提示“请全力治疗Tank。”,而DPS收到的提示却是“请全力输出BOSS。”
插件为每个玩家配置一个发信的工具,为了方便就叫话筒吧,话筒去对玩家发送消息。

我们可以把BOSS看做是一个被观察的主题,而小队中所有玩家对应的话筒都是观察者。一但BOSS进入了第一阶段,也就是BOSS状态变了,那么所有观察者(也就是话筒)都会受到相应的通知,并对自己对应的玩家发送消息。


现在看代码:
package com.subject;

import com.observer.I_Observer;
//被观察的主题的接口
public interface I_Subject {
	//注册一个观察者
	public void registerObserver(I_Observer o);
	//删除一个观察者
	public void removeObserver(I_Observer o);
	//通知所有观察者
	public void notifyObserver();
}



package com.subject;

import java.util.ArrayList;

import com.observer.I_Observer;
//假设这是插件用来检测BOSS状态的监听器。这里并没有实现监听功能。
public class BossListener implements I_Subject {
	ArrayList<I_Observer> listOfObserver;
	int status;

	public BossListener() {
		listOfObserver = new ArrayList<I_Observer>();
		status = 1;
	}

	public int getStatus() {
		return status;
	}
	
	public void setStatus(int status) {
		
		this.status = status;
		this.notifyObserver();
	}
	//通知所有观察者,并告诉观察者自己当前的状态
	@Override
	public void notifyObserver() {
		for (I_Observer o : listOfObserver) {
			o.update(this.status);
		}
	}

	@Override
	public void registerObserver(I_Observer o) {
		this.listOfObserver.add(o);
	}

	@Override
	public void removeObserver(I_Observer o) {
		int index = this.listOfObserver.indexOf(o);
		if (index >= 0) {
			this.listOfObserver.remove(index);
		}
	}

}



package com.observer;
//观察者的接口
public interface I_Observer {
	//状态改变时执行的动作
	public void update(int status);
}



package com.observer;

public abstract class Player implements I_Observer {
	//玩家的名字
	String name;
	//在第一阶段时,对玩家的提示。
	String suggestion1;
	//在第二阶段时,对玩家的提示。
	String suggestion2;
	//在第三阶段时,对玩家的提示。
	String suggestion3;

	public String getSuggestion1() {
		return suggestion1;
	}

	public void setSuggestion1(String suggestion1) {
		this.suggestion1 = suggestion1;
	}

	public String getSuggestion2() {
		return suggestion2;
	}

	public void setSuggestion2(String suggestion2) {
		this.suggestion2 = suggestion2;
	}

	public String getSuggestion3() {
		return suggestion3;
	}

	public void setSuggestion3(String suggestion3) {
		this.suggestion3 = suggestion3;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	//根据不同阶段,发送不同的通知消息。
	public void update(int status) {
		if (status == 1) {
			System.out.println("插件提示:Boss进入了第一阶段," + this.getName()
					+ suggestion1);
		} else if (status == 2) {
			System.out.println("插件提示:Boss进入了第二阶段," + this.getName()
					+ suggestion2);
		} else if (status == 3) {
			System.out.println("插件提示:Boss已经死亡,恭喜" + suggestion3);
		}
	}


}



package com.observer;

public class Tank extends Player {
	
	public Tank(String name) {
		this.name = name;
		this.name=name;
		this.suggestion1 = "请保持BOSS的仇恨";
		this.suggestion2 = "请保持BOSS的仇恨并躲好地上的火焰。";
		this.suggestion3 = ",BOSS已经死亡。";
	}
	//通知的逻辑已经在父类写过了,这里只用更改自己通知时的消息就行了
	@Override
	public void update(int status) {
		super.update(status);
	}
	
}



package com.observer;

public class DPS extends Player {
	public DPS(String name)
	{
		this.name=name;
		this.suggestion1 = "请全力输出BOSS。";
		this.suggestion2 = "请全力输出BOSS并躲好地上的火焰。";
		this.suggestion3 = ",BOSS已经死亡。";
	}

	@Override
	public void update(int status) {
		super.update(status);
	}

}



package com.observer;

public class Healther extends Player {
	public Healther(String name) {
		this.name = name;
		this.suggestion1 = "请全力治疗Tank。";
		this.suggestion2 = "请对全团治疗,保持团血在百分之50以上。";
		this.suggestion3 = ",BOSS已经死亡。";
	}

	@Override
	public void update(int status) {
		super.update(status);
	}

}



测试类:
package com.test;

import com.observer.DPS;
import com.observer.Healther;
import com.observer.Tank;
import com.subject.BossListener;

public class Test {
	public static void main(String[] args) {
		BossListener listener =new BossListener();
		listener.registerObserver(new Tank("MT"));
		listener.registerObserver(new Tank("2T"));
		listener.registerObserver(new DPS("DPS1"));
		listener.registerObserver(new Healther("Healther1"));
		listener.setStatus(1);
		listener.setStatus(2);
		listener.setStatus(3);
		
	}
}



插件提示:Boss进入了第一阶段,MT请保持BOSS的仇恨
插件提示:Boss进入了第一阶段,2T请保持BOSS的仇恨
插件提示:Boss进入了第一阶段,DPS1请全力输出BOSS。
插件提示:Boss进入了第一阶段,Healther1请全力治疗Tank。
插件提示:Boss进入了第二阶段,MT请保持BOSS的仇恨并躲好地上的火焰。
插件提示:Boss进入了第二阶段,2T请保持BOSS的仇恨并躲好地上的火焰。
插件提示:Boss进入了第二阶段,DPS1请全力输出BOSS并躲好地上的火焰。
插件提示:Boss进入了第二阶段,Healther1请对全团治疗,保持团血在百分之50以上。
插件提示:Boss已经死亡,恭喜,BOSS已经死亡。
插件提示:Boss已经死亡,恭喜,BOSS已经死亡。
插件提示:Boss已经死亡,恭喜,BOSS已经死亡。
插件提示:Boss已经死亡,恭喜,BOSS已经死亡。



看完这些代码和执行结果,再回头看一下观察者模式的定义:
在对象之间定义一对多的依赖,当一个对象改变状态时,依赖它的对象都会收到通知,并自动更新。

多个观察者依赖同一个BOSS监听器,BOSS监听器监听到BOSS状态改变,则通知所有话筒,这些观察者做出了各自的反应。


当然,写这个主要是为了巩固观察者模式,WOW插件只是个例子,真正的WOW插件是很复杂的。。。

最后,身为一个WOWer向所有WOW插件开发者敬礼。
1
0
分享到:
评论

相关推荐

    WOW插件制作指南PDF+WOW魔兽世界的APIs教程。

    WOW插件是由一系列lua脚本和XML文件组成的,这些文件定义了插件的行为和界面元素。Lua是一种轻量级的脚本语言,用于编写插件的核心逻辑,而XML则用于构建用户界面。 **WOW插件制作步骤:** 1. **规划插件功能**:...

    GM整合插件_wow313插件_Dewdrop插件_GM插件_

    "GM整合插件_wow313插件_Dewdrop插件_GM插件_"这个标题提到了一系列与WoW相关,特别是针对3.13版本的插件。这里我们将详细探讨这些插件及其在游戏中的作用。 首先,"wow313插件"指的是适用于WoW 3.13版本的插件。...

    WOW插件编写快速入手指南

    总之,WOW插件编写是一个融合了界面设计、事件处理和游戏API利用的过程。通过学习和实践,你可以创造出自己的插件,增强游戏体验,甚至分享给其他玩家。随着经验的积累,你将更深入地理解这一领域的魅力。

    WOW插件制作指南

    ### WOW插件制作指南知识点详解...通过以上总结,我们可以看出《WOW插件制作指南》是一本全面而详细的指南,不仅介绍了插件开发的基础知识,还提供了实用的示例和进一步学习的资源,非常适合想要进入这一领域的开发者。

    WOW简易基础入门插件、一个BUTTON、一个功能

    Lua是WOW插件常用的编程语言,它提供了灵活的语法和强大的功能,用于处理插件的各种逻辑。 2. `Nova.lua`:这同样是Lua脚本文件,可能包含了插件的主要逻辑和事件处理代码。在这个例子中,它可能会定义BUTTON1按钮的...

    WOW插件制作指南PDF+WOW魔兽世界的APIs教程

    本压缩包包含两部分资源:《WOW插件制作指南PDF》和《WOW魔兽世界的APIs教程》,将帮助你深入了解如何开发自己的魔兽世界插件。 《WOW插件制作指南PDF》可能涵盖了以下内容: 1. **插件基础**:介绍什么是插件,...

    WoW插件管理器.rar

    WoW插件管理器.rar WoW插件管理器.rar WoW插件管理器.rar WoW插件管理器.rar WoW插件管理器.rar WoW插件管理器.rar

    网页特效插件wow

    总结来说,Wow.js是一款强大的网页滚动特效插件,它简化了CSS3动画的触发过程,使得开发者可以更加专注于设计吸引人的视觉效果,而不必操心复杂的滚动事件监听和动画控制。配合Animate.css等库,可以实现各种炫酷的...

    WOWAPI和插件制作

    本压缩包文件可能包含了关于WOWAPI和插件制作的详细资料,让我们深入探讨这个主题。 1. **WOWAPI介绍**: - **基本概念**:WoW API是暴雪娱乐为游戏提供的编程接口,它让开发者能够访问游戏内部数据并控制某些游戏...

    wow.js动画插件

    Wow.js是javascript动画插件,经常配合animate.css一起使用。动画效果会在元素第一次出现在页面中时起作用。 引入wow.js 在需要使用的元素上添加class=”wow” 使用js初始化

    wow数学表达式计算插件

    【1】用 LUA解释器 实现魔兽世界 数学表达式计算插件 支持通用运算符和优先级 WoW Lua Math 库函数 以及 WoW Lua 环境变量 测试用例: /calc random(1,16) / 0x10 /calc log10(10) - log(exp(1)) /calc PI - rad...

    易语言源码易语言WoW插件管理器源码.rar

    3. **目录管理**:管理器需要遍历和管理WoW插件所在的文件夹,查找和识别插件文件,这涉及到目录操作和文件遍历的知识。 4. **网络通信**:如果插件管理器有在线更新功能,那么它需要通过网络下载最新的插件,这就...

    魔兽世界插件-LUA编辑器 WOWLUA

    WowLua 是一个在魔兽世界里边运行 Lua 脚本的编辑工具环境,他功能包括: 交互式 Lua 解释器 多页脚本编辑器。 语法着色 输出重定向到 WowLua 的输出窗口 WowLua 的输出窗口 /wowlua 或 /lua 打开 WowLua。 /...

    魔兽世界lua插件开发教程

    * 插件的结构:魔兽世界插件的结构主要包括插件头、插件体和插件尾。 * 事件处理:魔兽世界插件可以处理多种事件,包括鼠标事件、键盘事件等。 * UI开发:魔兽世界插件可以使用UI框架来开发用户界面。 * 数据库交互...

    UnderAchiever_v3.3.5b_wow_people_

    《UnderAchiever_v3.3.5b_wow_people_》是一个针对魔兽世界(World of Warcraft,简称WoW)的游戏插件,它的主要功能是模拟玩家已经完成的成就,以此来展示给其他玩家看。这个插件的名字“UnderAchiever”在英文中...

    一款锋利的jQuery动画插件wowslider

    WowSlider是一款强大的jQuery动画插件,专为网页设计师和开发者设计,旨在为网站增添生动、吸引人的图片切换效果。这款插件以其精美的动画和易用性而备受赞誉,不仅能够提升用户体验,还能在视觉上增强网站的整体...

    博学者插件EveryQuest (12个).rar

    "博学者插件EveryQuest (12个)" 是一个专门为魔兽世界设计的辅助插件,它极大地便利了玩家对游戏内任务的管理和追踪。本文将详细解析这个插件的功能、应用及其对游戏体验的提升。 首先,"EveryQuest" 插件的主要...

    SRS WOW HD音效插件

    SRS WOW HD音效插件很强大,SRS SRS(Sound Retrieval System)是由SRS研究所开发的、最具代表性的3D立体声技术。该技术的核心是可以利用2个扬声器获得环绕立体声的效果。更具体一点说,声波在周边各空间点都有其特定...

    国服 4.1大灾变CTM最全的插件

    《魔兽世界:大灾变CTM插件全集——打造极致游戏体验》 ...对于魔兽世界的爱好者而言,正确安装和使用这些插件,无疑能够提升游戏乐趣,降低操作难度,使玩家能够更好地沉浸在艾泽拉斯的世界之中。

    wow.min.js和animate.css

    "wow.min.js" 和 "animate.css" 是两个非常有用的工具,它们共同为网页添加了丰富的CSS3动画效果。接下来,我们将深入探讨这两个组件的工作原理、如何使用以及它们在网页设计中的应用。 首先,"wow.min.js" 是一个...

Global site tag (gtag.js) - Google Analytics