[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();

留言

這個網誌中的熱門文章

[Tools] GCOV & LCOV 初探

Quilt Patch 管理操作方法

[C#]C# Coding 規則