软件设计模式(JAVA) 09_观察者模式 _实验指导书

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 players = new ArrayList(); // 定义一个集合用于存储战队成员

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;

相关文档
最新文档