软件设计模式(JAVA) 09_观察者模式 _实验指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验(上机)九观察者模式
实验(上机)目的
1、练习使用行为型设计模式;
2、练习使用观察者模式的设计思路;
3、练习使用观察者模式实现“游戏中战队成员之间的联动”案例的实现。实验(上机)课时
2学时
实验(上机)环境
JDK1.8\Eclipse Mars
预备知识
1、观察者模式概述
2、观察者模式的结构与实现
3、观察者模式的应用实例
4、观察者模式与.NET中的委托事件模型
5、观察者模式与MVC
6、观察者模式的优缺点与适用环境
实验(上机)内容
在某多人联机对战游戏中,多个玩家可以加入同一战队组成联盟,当战队中的某一成员受到敌人攻击时将给所有其他盟友发送通知,盟友收到通知后将做出响应。
现使用观察者模式设计并实现该过程,以实现战队成员之间的联动。
新建解决方案,新建一个控制台应用程序,编写观察者模式实现代码,实现以上需求的案例,要求编写为控制台应用程序,并能调试运行。
实验(上机)步骤
1、本实例类图:
AllyControlCenter
{abstract}
# #allyName
players
: string
: List
+ + + + +SetAllyName (string allyName)
GetAllyName ()
Join (IObserver obs)
Quit (IObserver obs)
NotifyObserver (string name)
...
: void
: string
: void
: void
: void
IObserver
+Name: string
+
+
Help ()
BeAttacked (AllyControlCenter acc)
...
: void
: void
Player
-
+
<
<
name
Name
: string
: string
+
+
+
+
+
<
<
Player (string name)
set_Name (string value)
get_Name ()
Help ()
BeAttacked (AllyControlCenter acc)
...
: void
: string
: void
: void ConcreteAllyControlCenter
+
+
ConcreteAllyControlCenter (
string allyName)
NotifyObserver (string name)
...
: void
......
......
2创建ObserverSample的工程,并根据模式的角色创建对应的包。
3、AllyControlCenter:指挥部(战队控制中心)类,充当抽象目标类
package Subject;
import java.util.ArrayList;
import java.util.List;
import Observer.IObserver;
public abstract class AllyControlCenter {
protected String allyName; // 战队名称
protected List
public void SetAllyName(String allyName) {
this.allyName = allyName;
}
public String GetAllyName() {
return this.allyName;
}
// 注册方法
public void Join(IObserver obs) {
System.out.println(obs.getName() + "加入" + this.allyName + "战队!");
players.add(obs);
}
// 注销方法
public void Quit(IObserver obs) {
System.out.println(obs.getName() + "退出" + this.allyName + "战队!
");
players.remove(obs);
}
// 声明抽象通知方法
public abstract void NotifyObserver(String name);
}
4、ConcreteAllyControlCenter:具体指挥部类,充当具体目标类
package ConcreteSubject;
import Observer.IObserver;
import Subject.AllyControlCenter;
public class ConcreteAllyControlCenter extends AllyControlCenter {
public ConcreteAllyControlCenter(String allyName) {
System.out.println(allyName + "战队组建成功!");
System.out.println("----------------------------");
this.allyName = allyName;
}
// 实现通知方法
@Override
public void NotifyObserver(String name) {
System.out.println(this.allyName + "战队紧急通知,盟友" + name + "遭受敌人攻击!");
// 遍历观察者集合,调用每一个盟友(自己除外)的支援方法
for (Object obs : players) {
if (!((IObserver) obs).getName().equals(name)) {
((IObserver) obs).Help();
}
}
}
}
5、IObserver:抽象观察者类
package Observer;
import Subject.AllyControlCenter;
public abstract class IObserver {
protected String name;