.Net 设计模式进阶之路——观察者模式(Observer)
2021/8/22 8:06:10
本文主要是介绍.Net 设计模式进阶之路——观察者模式(Observer),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
🎏 序言
观察者模式,又叫发布-订阅模式(Publish/Subscribe),既然有观察者,当然也有被观察者,就如同在你的生活中,有一双明亮的眼睛时刻注视着你,你发生的大大小小的事情,它都了如指掌。
🎏 01.观察者模式的解释
意图: 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时 , 所有依赖于它的对象 都得到通知并被自动更新。
问题领域: 它一般用来解决下列问题。
观察者和被观察者需要解耦,或者有多个观察者
需要把自己的状态通知给其他对象
解决方案: 我们使用UML图来描述它。
图中可以看出,被观察者是Subject,其可以有很多观察者Observer,被观察者发布通知,观察者收到通知。
效果:
好处:
一个对象状态改变,可以通知所有的观察者;
观察者和被观察者只有抽象层耦合;
有一套触发机制
限定:
通知所有的观察者,在观察者多的时候会花费很多时间
观察者和被观察者间有循环依赖,可能导致系统崩溃
🎏 02. dotnet core 源码赏析
internal interface ICascadingValueComponent
{
// This interface exists only so that CascadingParameterState has a way
// to work with all CascadingValue<T> types regardless of T.
bool CanSupplyValue(Type valueType, string? valueName);
object? CurrentValue { get; }
bool CurrentValueIsFixed { get; }
void Subscribe(ComponentState subscriber);
void Unsubscribe(ComponentState subscriber);
}
//实现类
void ICascadingValueComponent.Unsubscribe(ComponentState subscriber)
{
_subscribers?.Remove(subscriber);
}
private void NotifySubscribers(in ParameterViewLifetime lifetime)
{
foreach (var subscriber in _subscribers!)
{
subscriber.NotifyCascadingValueChanged(lifetime);
}
}
发布订阅还是蛮常见的,在asp.net core代码中可以查看到很多类似的用法。
🎏 03. dotnet 生成器实现
构建一个抽象的观察者,并实现几个实例。
实例观察者实现,可以加到被观察者的观察列表。
public abstract class Visitor
{
public abstract void VisitConcreteElementA(
ConcreteElementA concreteElementA);
public abstract void VisitConcreteElementB(
ConcreteElementB concreteElementB);
}
/// <summary>
/// A 'ConcreteVisitor' class
/// </summary>
public class ConcreteVisitor1 : Visitor
{
public override void VisitConcreteElementA(
ConcreteElementA concreteElementA)
{
Console.WriteLine("{0} visited by {1}",
concreteElementA.GetType().Name, this.GetType().Name);
}
public override void VisitConcreteElementB(
ConcreteElementB concreteElementB)
{
Console.WriteLine("{0} visited by {1}",
concreteElementB.GetType().Name, this.GetType().Name);
}
}
调用方,可以按照实例类型调用直接使用。
ObjectStructure o = new ObjectStructure();
o.Attach(new ConcreteElementA());
o.Attach(new ConcreteElementB());
// Create visitor objects
ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();
// Structure accepting visitors
o.Accept(v1);
o.Accept(v2);
// Wait for user
Console.ReadKey();
作者:webmote33
链接:https://juejin.cn/post/6998909471766347784
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这篇关于.Net 设计模式进阶之路——观察者模式(Observer)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#