张德长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

设计模式之 Observer Pattern观察者模式

观察者模式
Observer
    Observer模式为组件向相关接收方【广播】消息提供了灵活的方法;
    该模式定义了对象一到多的依赖关系,这样当对象改变状态时,将自动通知并更新他所有的依赖对象;
    优点
        抽象了主体与Observer之间的耦合关系;
        支持广播方式的通信
    适用
        对一个对象的修改涉及其他对象的修改,而且不知道有多少对象需要进行修改;
        对象应该能够在不用假设对象标识的前提下,通知其他对象;

 

示例代码

/// <summary>
/// 数字生成器类
/// </summary>
public class NumberGenerator
{
/// <summary>
/// 存储随机生成的数字
/// </summary>
public int Number { get; private set; }
/// <summary>
/// 存储观察者
/// </summary>
private List<Observer> observers = new List<Observer>();
/// <summary>
/// 添加(注册)观察者
/// </summary>
/// <param name="observer"></param>
public void AddObserver(Observer observer) => observers.Add(observer);。
/// <summary>
/// 删除(取消注册)观察者
/// </summary>
/// <param name="observer"></param>
public void RemoveObserver(Observer observer) => observers.Remove(observer);
/// <summary>
/// 通知观察者,也就是逐个调用所有观察者的方法
/// </summary>
private void NotifyObservers()
{
foreach (var o in observers)
{
o.Update(this);
}
}
/// <summary>
/// 随机生成数字
/// </summary>
public void Execute()
{
Random r = new Random();
while (true)
{
Number = r.Next(1, 10);
NotifyObservers();
}
}
}
/// <summary>
/// 观察者接口
/// </summary>
public interface Observer
{
void Update(NumberGenerator numberGenerator);
}
/// <summary>
/// 数字观察者,打印数字
/// </summary>
public class DigitalObserver : Observer
{
public void Update(NumberGenerator numberGenerator)
{
Console.WriteLine($"更新数字:{numberGenerator.Number}");
Thread.Sleep(100);
}
}
/// <summary>
/// 图形观察者,按数字打印对应个数的符号
/// </summary>
public class GraphObserver : Observer
{
public void Update(NumberGenerator numberGenerator)
{
Console.Write("更新符号:");
for (int i = 0; i < numberGenerator.Number; i++)
{
Console.Write("*");
Thread.Sleep(100);
}
Console.WriteLine();
}
}
/// <summary>
/// 观察者模式 测试函数
/// </summary>
public static void ObserverPatternTest()
{
//数字生成器
NumberGenerator generator = new NumberGenerator();
//创建观察者对象
DigitalObserver digitalObserver = new DigitalObserver();
GraphObserver graphObserver = new GraphObserver();
//添加(注册)观察者对象
generator.AddObserver(digitalObserver);
generator.AddObserver(graphObserver);
//执行(生成随机数,并通知观察者进行打印)
generator.Execute();
}

 

posted on   张德长  阅读(12)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示