using System;
using System.Collections.Generic;
using System.Text;
namespace DesignPattern.BehaviorPattern.ObserverPattern
{
public class ObserverPattern
{
//观察者模式--一个对象的一个动作触发了后续一些列对象的动作,为了避免依赖太多对象,用观察者模式把这些对象的动作放到了上层 比如列子中的Miao() 和 MiaoObserver()
//事件是观察者模式更优雅的实现
//下端稳定 把变化都留个上端
public static void Show()
{
Cat cat = new Cat();
cat.Miao();
cat.AddObserver(new Dog());//把依赖甩出来放到上层
cat.AddObserver(new Baby());
cat.AddObserver(new Mouse());
cat.MiaoObserver();
cat._MiaoHandler += new Dog().Bark;
cat._MiaoHandler += new Baby().Cry;
cat._MiaoHandler += new Mouse().Run;
//观察者模式的事件模板
cat.MiaoEvent();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace DesignPattern.BehaviorPattern.ObserverPattern
{
public interface IObserver
{
void Action();
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace DesignPattern.BehaviorPattern.ObserverPattern
{
public class Cat
{
public void Miao()
{
Console.WriteLine("Miao~");
new Dog().Bark();//这些都是依赖
new Baby().Cry();
new Mouse().Run();
//...
}
private List<IObserver> _observerList = new List<IObserver>();
//去除依赖,保证我这个类自己的稳定,把其他类的动作交给上层
public void AddObserver(IObserver observer)
{
_observerList.Add(observer);
}
public void MiaoObserver()
{
Console.WriteLine("ObserverMiao~");
if (_observerList.Count <= 0)
return;
foreach (var observer in _observerList)
{
observer.Action();
}
}
public event Action _MiaoHandler;
public void MiaoEvent()
{
Console.WriteLine("EventMiao~");
_MiaoHandler?.Invoke();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace DesignPattern.BehaviorPattern.ObserverPattern
{
public class Dog : IObserver
{
public void Action()
{
Bark();
}
public void Bark()
{
Console.WriteLine("Dog Bark~");
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace DesignPattern.BehaviorPattern.ObserverPattern
{
public class Baby : IObserver
{
public void Action()
{
Cry();
}
public void Cry()
{
Console.WriteLine("Baby Cry~");
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace DesignPattern.BehaviorPattern.ObserverPattern
{
public class Mouse: IObserver
{
public void Action()
{
Run();
}
public void Run()
{
Console.WriteLine("Mouse Run~");
}
}
}