设计模式之观察者日常笔记

Posted bubuwobu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之观察者日常笔记相关的知识,希望对你有一定的参考价值。

    最近在复习C#的基础知识,今天刚好看到了观察者模式,便想着在此留下个记录,方便日后复习。

首先,概念性的东西百度上搜索有很多,这里就不拷贝黏贴了。下面将用今天看的一个猫和老鼠的例子讲解。

1、添加一个控制台应用程序,添加一个类为Cat

 1     /// <summary>
 2     /// 被观察者类
 3     /// </summary>
 4     public class Cat
 5     {
 6         private string Name;
 7         private string Color;
 8 
 9         public Cat(string name,string color) {
10             this.Name = name;
11             this.Color = color;
12         }
13 
14         //模拟被观察者状态变化
15         public void CatComing()
16         {
17             Console.WriteLine(Color + "" + Name + "猫来了!");
18         }
19     }

2、添加一个老鼠类

 1     /// <summary>
 2     /// 观察者类
 3     /// </summary>
 4     public class Mouse
 5     {
 6         private string Name;
 7         private string Color;
 8 
 9         public Mouse(string name, string color) {
10             this.Name = name;
11             this.Color = color;
12         }
13 
14         public void RunAway() {
15             Console.WriteLine(Color + "" + Name + "老鼠跑了!");
16         }
17     }

3、接下来我们在控制台去调用

1        static void Main(string[] args)
2         {
3             Cat cat = new Cat("猫1", "黑色");
4             Mouse mouse1 = new Mouse("老鼠1", "黑色");
5             Mouse mouse2 = new Mouse("老鼠2", "白色");
6             cat.CatComing();
7             Console.ReadKey();
8         }

很显然到现在我们还没有去使用我们的设计模式,好接下来我们去改造,首先我们会想怎么让猫的状态发生改变时能够调用老鼠的RunAway方法呢。

那我们是不是能把Cat作为参数传递到RunAway不就可以了,就变成下面这样

1        public void CatComing(Mouse mouse1, Mouse mouse2) {  
2        //模拟被观察者状态变化
3         public void CatComing()
4         {
5             Console.WriteLine(Color + "" + Name + "猫来了!");
6             mouse1.RunAway();
7             mouse2.RunAway();
8         }

Main方法调用时只要改成cat.CatComing(mouse1,mouse2); 

F5好像可以,但是我们如果新增加一直老鼠,我们是不是又要更改猫类的 CatComing方法,显然这样是不合适的,那还有什么方法呢?

接下来我们继续改造

1         public void CatComing()
2         {
3             Console.WriteLine(Color + "" + Name + "猫来了!");
4             catCome?.Invoke();  //相当于if(catCome!=null) catCome();
5         }
6 
7         //发布消息
8         public event Action catCome;

 

 1         static void Main(string[] args)
 2         {
 3             Cat cat = new Cat("猫1", "黑色");
 4             Mouse mouse1 = new Mouse("老鼠1", "黑色");
 5             cat.catCome += mouse1.RunAway; //注册
 6             Mouse mouse2 = new Mouse("老鼠2", "白色");
 7             cat.catCome += mouse2.RunAway; //注册 
 8             cat.CatComing();
 9             Console.ReadKey();
10         }

我们使用委托在我们catComing里面调用这个委托,然后把我们的老鼠的runAway注册进来,这样就解决上面的问题了

那如果我们有一百个老鼠类呢 我们是不是要注册一百次 我们继续进行修改

1         public Mouse(string name, string color, Cat cat) {
2             this.Name = name;
3             this.Color = color;
4 
5             cat.catCome += this.RunAway;
6         }

我们在老鼠类的构造函数上把猫类作为参数传递过来,直接在构造函数内注册

1        static void Main(string[] args)
2         {
3             Cat cat = new Cat("猫1", "黑色");
4             Mouse mouse1 = new Mouse("老鼠1", "黑色", cat);
5             Mouse mouse2 = new Mouse("老鼠2", "白色", cat);
6             cat.CatComing();
7             Console.ReadKey();
8         }

这样就完成啦。

虽然在园子里混了那么久,这还是第一次中规中矩的写文章,还是有点小激动的哈。

 

以上是关于设计模式之观察者日常笔记的主要内容,如果未能解决你的问题,请参考以下文章

[GeekBand] 设计模式之观察者模式学习笔记

Java学习笔记——设计模式之十.观察者模式

设计模式之观察者模式学习笔记

设计模式之观察者模式学习笔记

设计模式之观察者模式学习笔记

学C#之设计模式系列笔记观察者模式