【发布时间】:2019-09-17 09:54:52
【问题描述】:
我正在尝试使用 C# 实现可观察模式。在我的示例代码中,我有两种士兵弓箭手两个类: Archer 和 Swordsman 他们实现了 Soldier 接口。 Soldier 接口有四种方法:
- Attack() - 命令士兵攻击敌人
- Died() - 此方法在该示例中无关紧要
- Kill() - 命令我们的士兵杀死敌人
- BattleCry() - 在敌人被杀后庆祝所有我的士兵
还有一个属性 bool IsEnemyKilled - 当 Kill() 方法被调用时,IsEnemyKilled 变为 true。
这就是我想要做的:
我知道要实现观察者模式,我需要提供者和观察者。
当一名士兵例如弓箭手 - 杀死敌人archer.Kill();。
IsEnemyKilled 成为真的(这是我的提供者)和我所有的其他士兵(我的观察员),例如必须通知剑客和其他弓箭手 IsEnemyKilled 为真,并且他们必须调用 BattleCry()。
我很困惑该怎么做。如果有人提出想法,我将不胜感激。这是我的示例代码。
namespace ImplementObservable
{
class Program
{
static void Main(string[] args)
{
var archer = new Archer();
var swordsman = new Swordsman();
archer.Attack();
archer.Kill();
Console.ReadKey();
}
}
public class Archer : Soldier
{
bool IsEnemyKilled;
// watch somehow prop "IsEnemyKilled" and if it changes to true call BattleCry() for all units
public void Attack()
{
IsEnemyKilled = false;
Console.WriteLine("Archer attack!");
}
public void Died()
{
IsEnemyKilled = false;
Console.WriteLine("Archer died :(");
}
public void Kill()
{
IsEnemyKilled = true;
Console.WriteLine("Archer killed enemy! Hurray!!");
}
public void BattleCry()
{
Console.WriteLine("Archer: Go for victory !");
}
}
public class Swordsman : Soldier
{
bool IsEnemyKilled;
// watch somehow prop "IsEnemyKilled" and if it changes to true call BattleCry() for all units
public void Attack()
{
IsEnemyKilled = false;
Console.WriteLine("Swordsman attack!");
}
public void Died()
{
IsEnemyKilled = false;
Console.WriteLine("Swordsman died :(");
}
public void Kill()
{
IsEnemyKilled = true;
Console.WriteLine("Swordsman killed enemy! Hurray!!");
}
public void BattleCry()
{
Console.WriteLine("Swordsman: Go for victory !");
}
}
public interface Soldier
{
void Kill();
void Attack();
void Died();
void BattleCry();
}
}
【问题讨论】:
-
“我很困惑如何做到这一点。如果有人提出想法,我将不胜感激”并不是一个真正的问题。您似乎正在寻找一些辅导/指导,但是 StackOverflow 不是合适的地方(它是一个 Question 和 Answer 站点)。互联网上应该有很多关于如何在 C# 中以某种方式实现观察者模式的信息(包括您可以查看的代码示例......)
标签: c# design-patterns observer-pattern observers