您的位置:首页 > 编程语言 > C#

【C#】Event事件的应用之观察者模式

2015-11-26 00:55 489 查看
using System;

namespace Event
{
// 在游戏设计中,通常会出现这样的场景,有一个正在巡逻的敌军队伍,当玩家攻击了其中之一的敌人时
// 那个队伍的所有敌人都会注意到玩家,并且开始攻击玩家
// 以下便是个观察者模式的简略代码

// 玩家类(被观察者)
class Player
{
// 武器名字和攻击力
private string weaponName;
private int attackValue;

// 构造函数
public Player (string weaponName, int attack)
{
this.weaponName = weaponName;
attackValue = attack;
}

// 【方式一】定义一个委托,事件必须定义成类成员
// 这里思考一下这个问题,delegate也可以使用+=的方式注册,和event的方式其实是一样的
// 那么,为什么还要有event这个东西呢?因为delegate是可以通过 类名.委托名 的方式创建对象,并调用,写代码的时候很可能
// 一不小心就执行了一次delegate里的方法。而Event不是,它只能在类中调用,不能被类对象调用的,安全
public delegate void playerDelegate();
public event playerDelegate playerEvent;

// 【方式二】定义一个委托
public event Action playerAction;

// 玩家的攻击方法
public void PlayerAttack ()
{
Console.WriteLine ("有一个玩家正在使用名字是:" + weaponName  + "的武器发起攻击,武器攻击力是:" + attackValue);
// 如果事件列表中不为空,便通知事件的订阅者执行相应的方法
if (playerEvent != null) {
playerEvent();
}

if (playerAction != null) {
playerAction();
}
}

}

// 敌人类(观察者)
class Enemy
{
private string enemyName;
private int attackValue;

public Enemy (string name, int attack)
{
enemyName = name;
attackValue = attack;
}

// 当玩家攻击的时候,敌人调用此方法进行攻击
public void EnemyAttack ()
{
Console.WriteLine ("敌人" + enemyName + "正在发起攻击,对玩家造成" + attackValue + "点伤害!" );
}
}

class MainClass
{
// ====================================================
// 等号括起来的部分与观察者模式无关,只为event事件测试之用
public delegate void TestDelegate ();
// 声明委托类型变量,属于类成员
public TestDelegate testDelegate;

// 声明事件类型变量,属于类成员,事件必须声明为类成员
public event TestDelegate eventTestDelegate;

public static void Main (string[] args)
{
// 访问类成员testDelegate
MainClass mc = new MainClass ();
mc.eventTestDelegate += new TestDelegate(TestEvent);
mc.eventTestDelegate();
// ====================================================

//----------------------------------------
// 在游戏中,我们在这里可以加入一些判断将符合攻击距离或者视野内的敌人加入到事件当中
// 这时候便可以通过玩家的攻击一起触发敌人的方法
Player player = new Player("九齿钉耙",999);
Enemy enemy1 = new Enemy("孙悟空",82);
Enemy enemy2 = new Enemy("唐僧",65);
Enemy enemy3 = new Enemy("磨人的小妖精",47);
// 【方式一】使用事件的方式注册委托内容
player.playerEvent += new Player.playerDelegate(enemy1.EnemyAttack);
player.playerEvent += new Player.playerDelegate(enemy2.EnemyAttack);
player.playerEvent += new Player.playerDelegate(enemy3.EnemyAttack);
player.PlayerAttack();
Console.WriteLine ();

// 【方式二】使用Action的方式注册
player.playerAction += enemy1.EnemyAttack;
player.playerAction += enemy2.EnemyAttack;
player.playerAction += enemy3.EnemyAttack;

player.PlayerAttack();

}

// event测试用的方法
static void TestEvent ()
{
Console.WriteLine ("测试Event代码专用输出");
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: