.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<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();
        }
    }
}
推荐阅读
cjavapy编程之路首页