天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

把委托說透(4):委托與設計模式

委托與很多設計模式都有著千絲萬縷的聯系,在前面的隨筆中已經介紹了委托與策略模式的聯系,本節主要來討論委托與其他兩個模式:觀察者模式和模板方法模式。

委托與觀察者模式

在.NET中,很多設計模式得到了廣泛應用,如foreach關鍵字實現了迭代器模式。同樣的,.NET中也內置了觀察者模式的實現方式,這種方式就是委托。

觀察者模式的一般實現

網上可以找到很多資料介紹觀察者模式的實現,我這里介紹一種簡單的退化后的觀察者模式,即Subject類為具體類,在其之上不再進行抽象。

public class Subject{    private List<Observer> observers = new List<Observer>();    private string state;    public string State    {        set        {            state = value;            NotifyObservers();        }        get { return state; }    }    public void RegisterObserver(Observer ob)    {        observers.Add(ob);    }    public void RemoveObserver(Observer ob)    {        observers.Remove(ob);    }    public void NotifyObservers()    {        foreach (Observer ob in observers)            ob.Update(this);    }}public abstract class Observer{    public abstract void Update(Subject subject);}public class ConsoleObserver : Observer{    public ConsoleObserver(Subject subject)    {        subject.RegisterObserver(this);    }    public override void Update(Subject subject)    {        Console.WriteLine("Subject has changed its state : " + subject.State);    }}

調用的方法很簡單:

Subject subject = new Subject();Observer observer = new ConsoleObserver(subject);subject.State = "Kirin Yao";

Subject類維護一個列表,負責觀察者的注冊和移除。當其狀態發生改變時,就調用NotifyObservers方法通知各個觀察者。

觀察者模式的委托實現

在.NET中,使用委托可以更簡單更優雅地實現觀察者模式。在上一篇隨筆中,最后的示例其實就是一個觀察者模式。MainForm為Subject,SubForm為Observer。當MainForm的狀態發生改變時(即點擊“傳值”按鈕時),SubForm作為觀察者響應來自MainForm的變化。

與上例對應的,用委托實現的觀察者模式的代碼大致如下:

namespace DelegateSample{    class UpdateEventArgs : EventArgs { }    class Subject    {        private string state;        public string State         {            get { return state; }            set             {                state = value;                OnUpdate(new UpdateEventArgs());            }        }        public event EventHandler<UpdateEventArgs> Update;        public void ChangeState(string state)        {            this.State = state;            OnUpdate(new UpdateEventArgs());        }        private void OnUpdate(UpdateEventArgs e)        {            EventHandler<UpdateEventArgs> handler = Update;            if (handler != null)                Update(this, e);        }    }    abstract class Observer    {        public Subject Subject { get; set; }        public Observer(Subject subject)        {            this.Subject = subject;            this.Subject.Update += new EventHandler<UpdateEventArgs>(Subject_Update);        }        protected abstract void Subject_Update(object sender, UpdateEventArgs e);    }    class ConsoleObserver : Observer    {        public ConsoleObserver(Subject subject) : base(subject) { }        protected override void Subject_Update(object sender, UpdateEventArgs e)        {            Subject subject = sender as Subject;            if (subject != null)                Console.WriteLine("Subject has changed its state : " + subject.State);        }    }    class Program    {        static void Main(string[] args)        {            Subject subject = new Subject();            Observer ob = new ConsoleObserver(subject);            subject.State = "Kirin Yao";            Console.ReadLine();        }    }}

相比傳統的觀察者模式的實現方式(在Subject中維護一個Observer列表),使用委托避免了Subject與Observer之間的雙向引用,Subject作為主題類,對觀察者毫無所知,降低了耦合性,語法上也更加優雅。

委托與模板方法模式

模板方法模式封裝了一段通用的邏輯,將邏輯中的特定部分交給子類實現。

public abstract class AbstractClass{    public void Arithmetic()    {        SubArithmeticA();        SubArithmeticB();        SubArithmeticC();    }    protected abstract void SubArithmeticA();    protected abstract void SubArithmeticB();    protected abstract void SubArithmeticC();}public class ConcreteClass : AbstractClass{    protected override void SubArithmeticA()    {        //...    }    protected override void SubArithmeticB()    {        //...    }    protected override void SubArithmeticC()    {        //...    }}

然而這種繼承方式的模板方法耦合度較高,特別是如果邏輯與其外部實現沒有必然的從屬關系的時候,用傳統的模板方法就顯得不那么合適了。

在某種程度上,委托可以看做是一個輕量級的模板方法實現方式,它將邏輯中的特定部分轉交給注冊到委托的方法來實現。從而替代了繼承方式的模板方法模式中,在子類中實現特定邏輯的方式。

public delegate void SubArithmetic();public class ConcreteClass{    public void Arithmetic()    {        if (SubArithmetic != null)            SubArithmetic();    }    public SubArithmetic SubArithmetic { get; set; }}

而SubArithmetic的實現交給外部:

ConcreteClass concrete = new ConcreteClass();concrete.SubArithmetic = Program.SomeMethod;concrete.Arithmetic();

咋一看在客戶端中編寫委托的方法似乎還略顯麻煩,但值得注意的是,匿名方法和Lambda表達式為我們提供了更加簡便的委托語法。在函數式編程日益盛行的今天,我們應該為.NET提供的這種語言特性而感到慶幸。

NET技術把委托說透(4):委托與設計模式,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美性受xxxx狂喷水 | 老师我好爽再深一点老师好涨 | 国产精品婷婷五月久久久久 | 日本老妇一级特黄aa大片 | 被窝国产理论一二三影院 | 国产美女影院 | 国产精品99久久久久久AV蜜臀 | 国产精品久久久久久久久LI无码 | 亚洲在线国产日韩欧美 | 孕交videosgratis乌克兰 | 国产1769一七六九视频在线 | 免费观看国产视频 | 国产成人精品久久一区二区三区 | 亚洲欧美一区二区三区蜜芽 | 在线免费公开视频 | 中文字幕完整高清版 | 久久久久亚洲精品影视 | 东北小伙FREECHINESE野外 东北嫖妓对白粗口 | 免费A级毛片无码无遮挡内射 | 寂寞夜晚视频高清观看免费 | 强被迫伦姧惨叫VIDEO | 色欲久久综合亚洲精品蜜桃 | 纲手胸被爆羞羞免费 | 色偷偷男人的天堂a v | 亚洲伊人久久一次 | 久久久无码精品无码国产人妻丝瓜 | 碰超成人在线公开免费视频 | 久久本道久久综合伊人 | 国产无遮挡又黄又爽在线视频 | 国内精品乱码卡一卡2卡三卡 | 国产真实强被迫伦姧女在线观看 | 爱啪国产精品视频在线 | 99久久精品国产交换 | 理论片午午伦夜理片久久 | 久草免费视频在线观看 | 两个吃奶一个添下面视频 | 黑人巨摘花破女处 | 久久国产精品永久网站 | 色爱区综合小说 | 又爽又黄又粗又大免费视频 | 亚洲国产在线播放在线 |