[Design-Pattern] Observer Pattern
Observer Pattern - 觀察者模式
目的 : 處理一個物件對應多個物件之間的連動關係。類似 Mqtt sub/pub
當一個觀察者物件(Subject)改變時,其他的觀察者物件(Observer)都會收到通知,並執行對應的動作。
善用抽象類別
Subject
public abstract class Subject
{
protected List<Adventurer> adventurers = new List<Adventurer>();
public void add(Adventurer adventurer)
{
Console.WriteLine($"{adventurer.Name} subscribe the topic!");
adventurers.Add(adventurer);
}
public void remove(Adventurer adventurer)
{
adventurers.Remove(adventurer);
}
public abstract void sendQuestion(string msg);
}
Association
public class Association : Subject
{
public override void sendQuestion(string msg)
{
foreach (var adventurer in adventurers)
{
adventurer.getQuestions(msg);
}
}
}
Adventurer
public abstract class Adventurer
{
public string Name;
public Adventurer(string name)
{
this.Name = name;
}
public abstract void getQuestions(string msg);
}
Observers
public class Bard : Adventurer
{
public Bard(string name) : base(name)
{
}
public override void getQuestions(string msg)
{
Console.WriteLine($"{this.Name} got the {msg}");
}
}
public class Gunman : Adventurer
{
public Gunman(string name) : base(name)
{
}
public override void getQuestions(string msg)
{
Console.WriteLine($"{this.Name} got the {msg}");
}
}
public class Lancer : Adventurer
{
public Lancer(string name) : base(name)
{
}
public override void getQuestions(string msg)
{
Console.WriteLine($"{this.Name} got the {msg}");
}
}
Test
Subject subject = new Association();
var bard = new Bard("Bard");
var gunman = new Gunman("Gunman");
var lancer = new Lancer("Lancer");
subject.add(bard);
subject.add(gunman);
subject.add(lancer);
subject.sendQuestion("New Task!");
Console.ReadLine();
留言
張貼留言