“貓叫系統”開啟了觀察者模式


      眼看着looking for job的日子越來越近,感覺把以前的東西都忘記了,現在僅僅是記得一些基本概念,所以現在必須要拾起來。

      昨天看到了一道面試題,描述如下:貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。於是想了想,開啟了下面的觀察者模式:

一、  “貓叫系統”

      銀行的防盜系統、高溫預警系統、事件處理系統、監控系統,以及這里的“貓叫系統”,其共同特點在於:一個對象的改變會同時影響其他對象做出相應的變化,但是又不知道到底會影響多少個對象。

 

二、  觀察者模式

       觀察者模式定義了對象之間一對多的依賴關系,當一個對象的狀態發生變化時,所有依賴於該對象的其他對象都會被通知,然后自動更新。

       觀察者模式中,被觀察者管理其它的、依賴於它的觀察者對象,當被觀察者的狀態發生變化時,被觀察者會主動發出通知,通知依賴於它的觀察者,當觀察者收到通知時,會做出相應的動作。

 

三、  “貓叫系統”分析

       下面是該例的具體分析過程:

1、系統中共有3個對象:Cat、Mouse、Human

2、首先,明確一下,哪些對象是觀察者,也就是哪些對象需要被通知,哪些對象是被觀察者。這里,貓是被觀察者,正是由於貓的大叫,才引起后面的一系列反應。

3、當貓大叫的時候,就相當於發出了“警告”,此時,老鼠聽到了,然后做出了反應,那就是逃跑。同時,睡夢中的Human也被“警告”嚇醒了。

 

四、  觀察者模型

 

五、  模式實現

//Subject接口
    public abstract class Subject
    {
        private ArrayList observerList = new ArrayList();

        public void Attach(Observer observer)
        { 
            observerList.Add(observer); 
        }

        public void Detach(Observer observer)
        {
            observerList.Remove(observer); 
        }

        public void Notify()
        {
            foreach (Observer item in observerList)
            {
                item.Update();
            }
        }
    }
    public class Cat : Subject
    {
        private string catstate;
        public string CatState
        {
            get { return catstate; }
            set { catstate = value; }
        }
    }

//Observer接口
    public interface Observer
    {
        void Update();
}

//具體的Observer
    public class Mouse : Observer
    {
        private Cat cat;

        public Mouse(Cat cat)
        {
            this.cat = cat;
        }
        public void Update()
        {
            if (this.cat.CatState == "cry")
            {
                Console.WriteLine("The cat cry, and the Mouse run!" );
            }
        }
    }
    public class Human : Observer
    {
        private Cat cat;

        public Human(Cat cat)
        {
            this.cat = cat;
        }
        public void Update()
        {
            if (this.cat.CatState == "cry")
            {
                Console.WriteLine("The cat cry, and the Human wake!");
            }
        }
}

//系統開始運行
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.Attach(new Mouse(cat));
            cat.Attach(new Human(cat));

            cat.CatState = "cry";
            cat.Notify();
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM