C#设计模式之---观察者模式
阿里云国际版折扣https://www.yundadi.com |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
观察者模式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();
}
}
}