程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#設計形式之不雅察者形式實例講授

C#設計形式之不雅察者形式實例講授

編輯:C#入門知識

C#設計形式之不雅察者形式實例講授。本站提示廣大學習愛好者:(C#設計形式之不雅察者形式實例講授)文章只能為提供參考,不一定能成為您想要的結果。以下是C#設計形式之不雅察者形式實例講授正文


媒介

比來開端花點心思研討下設計形式,重要照樣讓本身寫的代碼可重用性高、包管代碼靠得住性。所謂設計形式,我找了下界說:是一套被重復應用、多半人知曉的、經由分類編目標、代碼設計經歷的總結。毫無疑問,設計形式於己於別人於體系都是多贏的;設計形式使代碼編制真正工程化;設計形式是軟件工程的基石頭緒,好像年夜廈的構造一樣。

為何要倡導“Design Pattern(設計形式)”?

基本緣由是為了代碼復用,增長可保護性。是以此次我們來進修下設計形式,最初會經由過程C#說話來完成這些設計形式作為例子,深入懂得個中的精華。

界說

不雅察者形式,有時被稱作宣布/定閱形式,不雅察者形式界說了一種一對多的依附關系,讓多個不雅察者對象同時監聽某一個主題對象。這個主題對象在狀況產生變更時,會告訴一切不雅察者對象,使它們可以或許主動更新本身。

特色

形式中具有的腳色

1。 籠統主題(Subject):它把一切不雅察者對象的援用保留到一個集合裡,每一個主題都可以有任何數目的不雅察者。籠統主題供給一個接口,可以增長和刪除不雅察者對象。

2。 詳細主題(ConcreteSubject):將有關狀況存入詳細不雅察者對象;在詳細主題外部狀況轉變時,給一切掛號過的不雅察者收回告訴。

3。籠統不雅察者(Observer):為一切的詳細不雅察者界說一個接口,在獲得主題告訴時更新本身。

4。詳細不雅察者(ConcreteObserver):完成籠統不雅察者腳色所請求的更新接口,以便使自己的狀況與主題狀況調和。

優缺陷

長處:

1、告訴通訊

不雅察者形式支撐播送通訊。被不雅察者會向一切的注冊過的不雅察者收回告訴。

2、聚耦合

不雅察者形式在被不雅察者和不雅察者之間樹立了一個籠統的耦合,被不雅察者其實不曉得任何一個詳細的不雅察者,只是保留著籠統不雅察者的列表,每一個詳細不雅察者都相符一個籠統不雅察者的接口。

缺陷:

1、時光龐雜度

假如一個被不雅察者對象有許多的直接和直接的不雅察者的話,將一切的不雅察者都告訴到會消費許多時光。

2、內聯缺乏

固然不雅察者形式可以隨時使不雅察者曉得所不雅察的對象發送了變更,然則不雅察者形式沒有響應的機制使不雅察者曉得所不雅察的對象是如何產生變更的。

3、輕易湧現輪回挪用

假如在被不雅察者之間有輪回依附的話,被不雅察者會觸發它們之間停止輪回挪用,招致體系瓦解,在應用不雅察者形式應特殊留意這點。

完成思緒

上面以xmfdsh宣布一篇博客的例子來講明不雅察者形式的完成。存眷了xmfdsh的同伙們,即可以經由過程不雅察者形式來及時獲得博客停止了更新的信息。當一個籠統模子有兩個方面,個中一個方面依附於另外一個方面,將這二者封裝在自力的對象中以使它們可以各自自力地轉變和復用的情形下。從方面的這個詞中可以想到,不雅察者形式確定在AOP(面向方面編程)中有所表現。是以這類需求應用不雅察者形式來處理就再適當不外了。

不雅察者向目的“定閱”它的轉變,而目的產生轉變後就“告訴”一切曾經“定閱”了它的轉變的不雅察者,從而履行“定閱”的內容。這類機制的利益在於下降耦合度,分工明白,目的只擔任在本身狀況產生轉變或做出某種行動時向本身的定閱清單收回“告訴”,而不是直接挪用不雅察者的行動(辦法);不雅察者只擔任向目的“定閱”它的變更,和界說本身在收到目的“告訴”後所須要做出的詳細行動(也就是定閱的內容)


// 定閱號籠統類
    public abstract class Blog
    {
        // 保留定閱者列表
        private List<IObserver> observers = new List<IObserver>();

        public string Symbol { get; set; }//描述定閱號的相干信息
        public string Info { get; set; }//描述此次update的信息
        public Blog(string symbol, string info)
        {
            this.Symbol = symbol;
            this.Info = info;
        }

        // 對統一個定閱號,新增和刪除定閱者的操作
        public void AddObserver(IObserver ob)
        {
            observers.Add(ob);
        }
        public void RemoveObserver(IObserver ob)
        {
            observers.Remove(ob);
        }

        public void Update()
        {
            // 遍歷定閱者列表停止告訴
            foreach (IObserver ob in observers)
            {
                if (ob != null)
                {
                    ob.Receive(this);
                }
            }
        }
    }

    // 詳細定閱號類
    public class MyBlog : Blog
    {
        public MyBlog(string symbol, string info)
            : base(symbol, info)
        {
        }
    }

    // 定閱者接口
    public interface IObserver
    {
        void Receive(Blog tenxun);
    }

    // 詳細的定閱者類
    public class Subscriber : IObserver
    {
        public string Name { get; set; }
        public Subscriber(string name)
        {
            this.Name = name;
        }

        public void Receive(Blog xmfdsh)
        {
            Console.WriteLine("定閱者 {0} 不雅察到了{1}{2}", Name, xmfdsh.Symbol, xmfdsh.Info);
        }
    }

    // 客戶端測試
    class Program
    {
        static void Main(string[] args)
        {
            Blog xmfdsh = new MyBlog("xmfdsh", "宣布了一篇新博客");

            // 添加定閱者
            xmfdsh.AddObserver(new Subscriber("王尼瑪"));
            xmfdsh.AddObserver(new Subscriber("唐馬儒"));
            xmfdsh.AddObserver(new Subscriber("王蜜桃"));
            xmfdsh.AddObserver(new Subscriber("敖尼瑪"));

            //更新信息
            xmfdsh.Update();
            //輸入成果,此時一切的定閱者都曾經獲得博客的新新聞
            Console.ReadLine();
        }
    }

運轉的後果圖以下:

此類完成辦法的類圖以下:

這個類圖是visual studio生成的,能夠看起來比擬凌亂把,如許的完成就是不雅察者形式的完成。任什麼時候候,只需履行了Update辦法,便會主動的去告訴推送給定閱了此定閱號 的用戶,但是在C#中,我們更多的是應用拜托與事宜來簡化不雅察者形式的完成。


class Program
    {
        // 拜托充任定閱者接口類
        public delegate void NotifyEventHandler(object sender);

        // 籠統定閱號類
        public class Blog
        {
            public NotifyEventHandler NotifyEvent;
            public string Symbol { get; set; }//描述定閱號的相干信息
            public string Info { get; set; }//描述此次update的信息
            public Blog(string symbol, string info)
            {
                this.Symbol = symbol;
                this.Info = info;
            }

            #region 新增對定閱號列表的保護操作
            public void AddObserver(NotifyEventHandler ob)
            {
                NotifyEvent += ob;
            }
            public void RemoveObserver(NotifyEventHandler ob)
            {
                NotifyEvent -= ob;
            }

            #endregion

            public void Update()
            {
                if (NotifyEvent != null)
                {
                    NotifyEvent(this);
                }
            }
        }

        // 詳細定閱號類
        public class MyBlog : Blog
        {
            public MyBlog(string symbol, string info)
                : base(symbol, info)
            {
            }
        }

        // 詳細定閱者類
        public class Subscriber
        {
            public string Name { get; set; }
            public Subscriber(string name)
            {
                this.Name = name;
            }

            public void Receive(Object obj)
            {
                Blog xmfdsh = obj as Blog;

                if (xmfdsh != null)
                {
                    Console.WriteLine("定閱者 {0} 不雅察到了{1}{2}", Name, xmfdsh.Symbol, xmfdsh.Info);
                }
            }
        }

        static void Main1(string[] args)
        {
            Blog xmfdsh = new MyBlog("xmfdsh", "宣布了一篇新博客");
            Subscriber wnm = new Subscriber("王尼瑪");
            Subscriber tmr = new Subscriber("唐馬儒");
            Subscriber wmt = new Subscriber("王蜜桃");
            Subscriber anm = new Subscriber("敖尼瑪");

            // 添加定閱者
            xmfdsh.AddObserver(new NotifyEventHandler(wnm.Receive));
            xmfdsh.AddObserver(new NotifyEventHandler(tmr.Receive));
            xmfdsh.AddObserver(new NotifyEventHandler(wmt.Receive));
            xmfdsh.AddObserver(new NotifyEventHandler(anm.Receive));

            xmfdsh.Update();

            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine();

            Console.WriteLine("移除定閱者王尼瑪");
            xmfdsh.RemoveObserver(new NotifyEventHandler(wnm.Receive));
            xmfdsh.Update();

            Console.ReadLine();
        }
    }

運轉的成果:

類圖:

總結

到這裡,不雅察者形式就講完了,不雅察者形式界說了一種一對多的依附關系,讓多個不雅察者對象可以同時監聽某一個主題對象,這個主題對象在產生狀況變更時,會告訴一切不雅察者對象,使它們可以或許主動更新本身,是以在一些需求上是當一個對象的轉變須要同時轉變多個其他對象的時刻,且不曉得若干個對象須要去告訴轉變的時刻,不雅察者形式就成了首選,這類形式的用的最多的,在我的開辟閱歷中就是windows phone手機客戶真個開辟了,常常要用到這類的拜托事宜的處置,用多了後發明就習認為常,這類形式也就沒那末稀罕了。

源碼下載地址:http://xiazai.jb51.net/201410/tools/ConsoleApplication2.rar

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved