开发手册 欢迎您!
软件开发者资料库

.NET(C#) 设计模式 观察者模式

设计模式(Design pattern)是代码设计经验的总结。设计模式主要分三个类型:创建型、结构型和行为型。创建型是对象实例化的模式,创建型模式用于解耦对象的实例化过程,主要用于创建对象。结构型是把类或对象结合在一起形成一个更大的结构,主要用于优化不同类、对象、接口之间的结构关系。行为型是类和对象如何交互,及划分责任和算法。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。本文主要介绍.NET(C#) 设计模式 观察者模式。

观察者模式(Observer Pattern)

观察者模式(Observer Pattern)是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。观察者模式的主要的作用就是对对象解耦,将观察者和被观察者完全隔离。

1)面向对象方式实现

using System;using System.Collections.Generic;namespace ConsoleApplication{    //一般每个接口或类都写在单独的.cs文件中    //本示例为了执行查看方便才写在一起      ///     public interface IObserver    {        void Action();    }    public class Baby : IObserver    {        public void Action()        {            this.Cry();        }        public void Cry()        {            Console.WriteLine("{0} Cry", this.GetType().Name);        }    }    public class Brother : IObserver    {        public void Action()        {            this.Turn();        }        public void Turn()        {            Console.WriteLine("{0} Turn", this.GetType().Name);        }    }    public class Chicken : IObserver    {        public void Action()        {            this.Woo();        }        public void Woo()        {            Console.WriteLine("{0} Woo", this.GetType().Name);        }    }    public class Dog : IObserver    {        public void Action()        {            this.Wang();        }        public void Wang()        {            Console.WriteLine("{0} Wang", this.GetType().Name);        }    }    public class Neighbor : IObserver    {        public void Action()        {            this.Awake();        }        public void Awake()        {            Console.WriteLine("{0} Awake", this.GetType().Name);        }    }    public class Animal    {        //一般的实现        //public void Sound()        //{        //    Console.WriteLine("{0} Sound.....", this.GetType().Name);        //    new Chicken().Woo();        //    new Baby().Cry();        //    new Brother().Turn();        //    new Dog().Wang();        //    new Neighbor().Awake();        //}        private List _ObserverList = new List();        public void Add(IObserver observer)        {            this._ObserverList.Add(observer);        }        public void Remove(IObserver observer)        {            this._ObserverList.Remove(observer);        }        public void SoundObserver()        {            Console.WriteLine("{0} SoundObserver.....", this.GetType().Name);            foreach (var observer in this._ObserverList)            {                observer.Action();            }        }    }    //     /// 观察者模式    /// 对象和行为的分离    ///     class Program    {        static void Main(string[] args)        {            Animal animal = new Animal();            animal.Add(new Baby());            animal.Add(new Brother());            animal.Add(new Chicken());            animal.Add(new Dog());            animal.Add(new Neighbor());            animal.SoundObserver();        }    }}

2)事件委托方式实现

using System;using System.Collections.Generic;namespace ConsoleApplianimalion{    //一般每个接口或类都写在单独的.cs文件中    //本示例为了执行查看方便才写在一起      public interface IObserver    {        void Action();    }    public class Baby : IObserver    {        public void Action()        {            this.Cry();        }        public void Cry()        {            Console.WriteLine("{0} Cry", this.GetType().Name);        }    }    public class Brother : IObserver    {        public void Action()        {            this.Turn();        }        public void Turn()        {            Console.WriteLine("{0} Turn", this.GetType().Name);        }    }    public class Chicken : IObserver    {        public void Action()        {            this.Woo();        }        public void Woo()        {            Console.WriteLine("{0} Woo", this.GetType().Name);        }    }    public class Dog : IObserver    {        public void Action()        {            this.Wang();        }        public void Wang()        {            Console.WriteLine("{0} Wang", this.GetType().Name);        }    }    public class Neighbor : IObserver    {        public void Action()        {            this.Awake();        }        public void Awake()        {            Console.WriteLine("{0} Awake", this.GetType().Name);        }    }    public class Animal    {        //一般的实现        //public void Sound()        //{        //    Console.WriteLine("{0} Sound.....", this.GetType().Name);        //    new Chicken().Woo();        //    new Baby().Cry();        //    new Brother().Turn();        //    new Dog().Wang();        //    new Neighbor().Awake();        //}        public event Action SoundHandler;        public void SoundEvent()        {            Console.WriteLine("{0} SoundEvent.....", this.GetType().Name);            if (this.SoundHandler != null)            {                //foreach (Action action in this.SoundHandler.GetInvoanimalionList())                //{                //    action.Invoke();                //}                this.SoundHandler.Invoke();            }        }    }    //     /// 观察者模式    /// 对象和行为的分离    ///     class Program    {        static void Main(string[] args)        {            Animal animal = new Animal();            animal.SoundHandler += new Action(() => new Dog().Wang());            animal.SoundHandler += new Chicken().Woo;            animal.SoundHandler += new Baby().Cry;            animal.SoundHandler += new Brother().Turn;            animal.SoundHandler += new Neighbor().Awake;            animal.SoundEvent();        }    }}