委托系列07-多播委托之观察者模式
一、案例需求
??有一个Cat类,其中有一个Miao(猫叫)的方法。每次猫叫后,其他动物就会执行响应的动作。
代码:
public class Cat
{
public void Miao()
{
Console.WriteLine("{0} Miao", this.GetType().Name);
}
}
二、普通方式
代码:
public class Cat
{
public void Miao()
{
Console.WriteLine("{0} Miao", this.GetType().Name);
new Dog().Wang(); //狗叫了
new Mouse().Run();//老鼠跑了
new Baby().Cry(); // 小孩哭了
new Mother().Wispher();
new Father().Roar();
new Neighbor().Awake();
new Stealer().Hide();
}
}
??以上这种方式存在以下问题:
- 1.职责不单一---一个类中包含的职责太多了,除了Miao 一声,依赖于其他的类太多;
- 2.依赖太重--依赖于Dog、Mouse、....---代码不稳定;Dog、Mouse、....任何一个类的修改,都有可能会影响到这只猫;
- 3.这完全是面向过程式编程--完全是翻译需求;
三、多播委托(观察者模式)
1、创建委托
public Action MiaoAction = null;
2、创建MiaoDelegate方法,用于执行委托
///
/// 这个方法仅仅只是Miao一声
/// 引发的动作---可以放到多播委托中去
///
public void MiaoDelegate()
{
Console.WriteLine("{0} MiaoDelegate", this.GetType().Name);
//方式一:
//if (MiaoAction != null)
//{
// MiaoAction.Invoke();
//}
//方式二:
MiaoAction?.Invoke();//?. 如果不为null ,就执行后面的动作
}
3、注册委托
Console.WriteLine("************************this is delegate****************************");
{
cat.MiaoAction += new Dog().Wang; //狗叫了
cat.MiaoAction += new Mouse().Run;//老鼠跑了
cat.MiaoAction += new Mother().Wispher;
cat.MiaoAction += new Baby().Cry; // 小孩哭了
//cat.MiaoAction += new Mother().Wispher;
cat.MiaoAction += new Father().Roar;
cat.MiaoAction += new Neighbor().Awake;
cat.MiaoAction += new Stealer().Hide;
}
4、执行委托
Console.WriteLine("************************this is delegate****************************");
{
cat.MiaoAction += new Dog().Wang; //狗叫了
cat.MiaoAction += new Mouse().Run;//老鼠跑了
cat.MiaoAction += new Mother().Wispher;
cat.MiaoAction += new Baby().Cry; // 小孩哭了
//cat.MiaoAction += new Mother().Wispher;
cat.MiaoAction += new Father().Roar;
cat.MiaoAction += new Neighbor().Awake;
cat.MiaoAction += new Stealer().Hide;
//执行委托
cat.MiaoDelegate();
}
5、输出结果
6、优势
7、多播委托的另外一种实现方式
1、代码准备
IObject接口:
public interface IObject
{
void DoAction();
}
Dog类实现了IObject接口:
public class Dog : IObject
{
//public Dog(int id,string i)
//{
//}
public void DoAction()
{
this.Wang();
}
public void Wang()
{
Console.WriteLine("{0} Wang", this.GetType().Name);
}
}
其他的动物类都实现了IObject接口,就不在此赘述。
2、声明List集合
public List observerlist = new List();
3、声明MiaoObsever方法
public void MiaoObsever()
{
//Console.WriteLine("{0} MiaoObsever", this.GetType().Name);
if (observerlist.Count > 0)
{
//observerlist.ForEach(item => item.DoAction());
foreach (var item in observerlist)
{
item.DoAction();
}
}
}
4、将动物类添加至observerlist集合
Console.WriteLine("************************this is Obeserver****************************");
{
cat.observerlist.Add(new Dog()); //狗叫了
cat.observerlist.Add(new Mouse());//老鼠跑了
cat.observerlist.Add(new Baby()); // 小孩哭了
cat.observerlist.Add(new Mother());
cat.observerlist.Add(new Father());
cat.observerlist.Add(new Neighbor());
cat.observerlist.Add(new Stealer());
}
5、执行MiaoObsever方法,执行每个动物类的动作
Console.WriteLine("************************this is Obeserver****************************");
{
cat.observerlist.Add(new Dog()); //狗叫了
cat.observerlist.Add(new Mouse());//老鼠跑了
cat.observerlist.Add(new Baby()); // 小孩哭了
cat.observerlist.Add(new Mother());
cat.observerlist.Add(new Father());
cat.observerlist.Add(new Neighbor());
cat.observerlist.Add(new Stealer());
//执行每个类的动作
cat.MiaoObsever();
}