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<IObserver> _ObserverList = new List<IObserver>();
        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();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lwf3115841/article/details/131726885