观察者模式(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();
}
}
}