最近在复习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 }
这样就完成啦。
虽然在园子里混了那么久,这还是第一次中规中矩的写文章,还是有点小激动的哈。