当前位置: 首页 > news >正文

装修装饰网站建设佛山的网站建设公司

装修装饰网站建设,佛山的网站建设公司,网站自然排名怎么,餐饮管理系统排名前言 观察者#xff08;Observer)模式也称发布-订阅#xff08;Publish-Subscribe#xff09;模式#xff0c;定义了对象间一种一对多的依赖关系#xff0c;当一个对象的状态发生改变时#xff0c;所有依赖于它的对象都得到通知并被自动更新。 观察者模式的图解如下所示…前言 观察者Observer)模式也称发布-订阅Publish-Subscribe模式定义了对象间一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。 观察者模式的图解如下所示 Subject目标 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 目标提供了注册和删除观察者对象的接口。 Observer观察者 为那些在目标发生改变时需获得通知的对象定义一个更新接口。 ConcreteSubject具体目标 将有关状态存入各ConcreteObserver对象。 当它的状态发生改变时向它的各个观察者发出通知。 ConcreteObserver具体观察者 维护一个指向ConcreteSubject对象的引用。 存储有关状态这些状态应与目标的状态保存一致。 实现Observer的更新接口以使自身状态与目标的状态保持一致。 不使用事件的示例 接下来我将根据上面的图解写一个C#观察者模式的例子刚开始这个例子没有使用事件在后面一个例子中使用事件。 首先来看看Subject目标 //主题接口public interface ISubject{public void Attach(Observer observer);public void Detach(Observer observer);public void Notify();public string? SubjectState { get; set; }}这里我使用的是接口里面有Attach、Detach和Notify方法的声明还有SubjectState属性的声明。 接下来看看ConcreteSubject具体目标 public class School : ISubject{private IListObserver observers new ListObserver();public string? SubjectState { get; set; }public void Attach(Observer observer){observers.Add(observer);}public void Detach(Observer observer){observers.Remove(observer);}public void Notify(){foreach (var observer in observers){observer.Update();}}}这里我以学校发通知为例School类实现了ISubject接口有一个观察者的列表在Attach方法中添加一个观察者在Detach方法中移除一个观察者。在Notify方法中遍历观察者的列表让每一个观察者都执行Update方法。 现在来看看Observer观察者 public abstract class Observer{protected string? name;protected ISubject? subject;public Observer(string name,ISubject subject){this.name name;this.subject subject;}public abstract void Update();}这是一个抽象类包含有一个抽象的Update方法。 再看看ConcreteObserver具体观察者 public class Student : Observer{public Student(string name,ISubject subject) : base(name,subject) { }public override void Update() {Console.WriteLine(${name}接收到来自学校的通知{subject?.SubjectState},时间{DateTime.Now}\r\n);}}这里我以学生接收来自学校的消息为例Student类继承自Observer抽象类并重写了Update方法。 最后来看看怎么使用观察者模式 static void Main(string[] args){School school new School();Student student1 new Student(小王, school);Student student2 new Student(小明, school);Student student3 new Student(小红, school);school.Attach(student1);school.Attach(student2);school.Attach(student3);school.SubjectState 学校放假了;school.Notify();school.Detach(student3);Task.Delay(3000).Wait();school.SubjectState 学校开学了;school.Notify();Console.ReadLine();}创建一个School对象三个Student对象。 school.Attach(student1);school.Attach(student2);school.Attach(student3);表示将student1、student2、student3添加到school中的观察者列表中。 school.SubjectState 学校放假了;school.Notify();设置school中SubjectState属性的值然后调用school的Notify方法。 school.Detach(student3);将student3从school的观察者列表中移除。 Task.Delay(3000).Wait();等待3秒。 school.SubjectState 学校开学了;school.Notify();Console.ReadLine();重新设置school中SubjectState属性的值然后再调用school的Notify方法。 运行结果如下所示 学校放假了小王、小明和小红都接收到了学校的通知。由于后面小红被移出了观察者列表因此学校开学了的消息小红没有接收到。 使用事件的示例 C#中可以通过事件来使用观察者模式接下来我将以一个示例加以说明。 自定义事件数据类 public class SendMessageArgs : EventArgs{public string? Message { get; set; }public DateTime DateTime { get; set; }public SendMessageArgs(string? message){Message message;DateTime DateTime.Now;}}Person类 public class Person{public string? Name { get; set; }public event EventHandlerSendMessageArgs? SendMessageEvent;public Person(string? name){Name name;}public void SendMessage(string message) { SendMessageArgs sendMessageArgs new SendMessageArgs(message); SendMessageEvent?.Invoke(this, sendMessageArgs);}public void ShowMessage(object? sender,SendMessageArgs e){Person? person (Person?)sender;Console.WriteLine(${this.Name}收到来自{person?.Name}的消息{e.Message},时间{e.DateTime}\r\n);}public void Subscribe(Person person){person.SendMessageEvent ShowMessage;}public void UnSubscribe(Person person){person.SendMessageEvent - ShowMessage;}}Person类中的SendMessage方法会触发事件ShowMessage方法是事件处理程序Subscribe方法可以订阅事件UnSubscribe方法可以取消订阅事件。 现在来看看是怎么使用 static void Main(string[] args) {Person Trump new Person(川普);Person Biden new Person(拜登);Person person1 new Person(person1);Person person2 new Person(person2);Person person3 new Person(person3);person1.Subscribe(Trump);person2.Subscribe(Trump);person3.Subscribe(Trump);person1.Subscribe(Biden);Trump.SendMessage(Nobody knows ... better than me!!!);Task.Delay(2000).Wait();Biden.SendMessage(I dont believe it!!!);person3.UnSubscribe(Trump);Task.Delay(2000).Wait();Trump.SendMessage(Make ... Great Again!!!);Console.ReadLine(); }创建了5个Person对象分别为Trump、Biden、person1、person2、person3。 person1、person2、person3订阅了Trumpperson1订阅了Biden。 Trump发了一条消息然后过了2秒Biden也发了一条消息。 person3不再订阅Trump过了2秒Trump又发消息了。 运行结果如下所示 由于person1、person2、person3订阅了Trump所以可以收到来自Trump的消息。 由于person1订阅了Biden所以可以收到来自Biden的消息。 后面person3退订了Trump所以只有person1、person2能收到来自Trump的消息。 总结 以上使用C#分别创建了不通过事件与通过事件的示例介绍了在C#中如何使用观察者模式希望对你有所帮助。 参考 1、《Head First 设计模式中文版》 2、《大话设计模式》 3、《设计模式可复用面向对象软件的基础》 4、YouTube [Design Patterns: C# Pub-Sub Simple Twitter example]
http://www.pierceye.com/news/355873/

相关文章:

  • 北京工程信息网站网站建设及管理使用情况汇报
  • 网页网站原型图占位符怎么做公司宣传策划方案
  • 企业网站颜色选择wordpress自然志下载
  • 介绍几个网站重庆网站建设微信开发
  • wordpress小工具跟随最新外贸seo
  • 网站域名的密码电子商务网站策划书3500字
  • 2008 iis 添加 网站 权限设置权限网站开发工程师题
  • 公司域名查询网站网页设计工具软件有哪些
  • 毕业设计网站建设选题依据设计公司网站应该包括的信息
  • wordpress 仪表板主题seo网站排名厂商定制
  • 网站建设成本报表wordpress缺点
  • 外贸建站选择哪个服务器好免费自动生成二维码
  • 建设部申请自己网站c 做网站设计
  • 软件制作网站网站维护合同模板
  • 那家财经网站做的好陕西网站建设公司哪有
  • 淄川网站建设中小型企业网站建设
  • phpcms 投资 网站源码wordpress主题网站
  • 聊城网站托管义乌外贸公司联系方式
  • 开发一个小程序对网站做综合搜索引擎优化分析
  • 网站开发自学网有哪些企业可以做招聘的网站有哪些
  • 网站怎么做百度推广网站开发者模式
  • 学校网站设计制作目的做网站推广方法
  • wordpress建站云平台小程序商城开发平台
  • pc网站转换成微网站网站建设开发哪家质量好
  • wordpress网站使用教程aspnet东莞网站建设多少钱
  • 网站地图提交给百度证券公司如何拉客户
  • 做外贸有哪些免费的网站win7优化大师好不好
  • 网站功能怎么写上海网站制作建设怎么样
  • 网站域名是网站架构吗成都网站搭建优化推广
  • 自己做的网站添加交费功能合肥有什么好的网站建设公司好