设计模式概览
- 创建型模式
- 抽象工厂模式(Abstract Factory)
- 建造者模式(Builder)
- 工厂方法模式(Factory Method)
- 原型模式(Prototype)
- 单例模式(Singleton)
- 结构型模式
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 组合模式(Composite)
- 装饰模式(Decorator)
- 外观模式(Facade)
- 享元模式(Flyweight)
- 代理模式(Proxy)
- 行为型模式
- 职责链模式(Chain of Responsibility)
- 命令模式(Command)
- 解释器模式(Interpreter)
- 迭代器模式(Iterator)
- 中介者模式(Mediator)
- 备忘录模式(Memento)
- 观察者模式(Observer)
- 状态模式(State)
- 策略模式(Strategy)
- 模板方法模式(Template Method)
- 访问者模式(Visitor)
观察者模式
例如:一个按钮相当于被观察者,而数据管理器,音乐,相当于观察者,我们点击按钮就会触发观察者不同行为
案例:猫捉老鼠
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 观察者模式 { public class Cat { public string name; public void CatComing(Mouse mouse1, Mouse mouse2, Mouse mouse3) { Console.WriteLine($"{name} is coming"); mouse1.MouseRun(); mouse2.MouseRun(); mouse3.MouseRun(); } } public class Mouse { public string name; public void MouseRun() { Console.WriteLine($"{name} is Running Away"); } } internal class Program { static void Main(string[] args) { Cat cat = new Cat() { name = "Tom" }; Mouse mouse1 = new Mouse() {name = "Jerry1" }; Mouse mouse2 = new Mouse() { name = "Jerry2" }; Mouse mouse3 = new Mouse() { name = "Jerry3" }; cat.CatComing(mouse1, mouse2, mouse3); } } }

这段代码的意思是:当猫来了,老鼠逃跑
但是实现是将老鼠传入猫的方法当中,一旦老鼠一多,代码就变得冗长且难以维护
所以在这里我们将猫来了这个函数作为一个消息,这个消息会发送给老鼠
此时我们将被观察者建立一个委托,将观察者的逃跑方法加入的这个委托,只要被观察者一来就调用这个委托,委托的内容就是观察者逃跑
同样有类比:按钮是被观察者,当他被点击的时候就会调用这个委托,而这个委托的内容实际上是其他类(例如声音类用来调整音量的方法),只要按钮一被点击,就会静音
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 观察者模式 { public class Cat { public string name; public Action Listener; public void CatComing() { Console.WriteLine($"{name} is coming"); Listener?.Invoke(); } } public class Mouse { public string name; public void MouseRun() { Console.WriteLine($"{name} is Running Away"); } } internal class Program { static void Main(string[] args) { Cat cat = new Cat() { name = "Tom" }; Mouse mouse1 = new Mouse() {name = "Jerry1" }; Mouse mouse2 = new Mouse() { name = "Jerry2" }; Mouse mouse3 = new Mouse() { name = "Jerry3" }; //注册 cat.Listener += mouse1.MouseRun; cat.Listener += mouse2.MouseRun; cat.Listener += mouse3.MouseRun; cat.CatComing(); } } }
在观察者将自己的方法传入委托的过程就叫做注册
用事件来优化,保证事件不能在类外触发public event Action Listener;
*被观察者*声明事件的过程叫做**发布消息**,而*观察者*将自身方法注册进被观察者的过程叫**订阅消息**
评论(0)
暂无评论