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

福建建设建设厅官方网站泰安专业的网站建设

福建建设建设厅官方网站,泰安专业的网站建设,王也微信头像图片,如何制作一个完整的网页一、概述 观察者模式是一种常用的设计模式#xff0c;它属于行为型模式。在C#中#xff0c;观察者模式通过定义一种一对多的依赖关系#xff0c;使得当一个对象的状态发生变化时#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现松耦合#xff0c;… 一、概述 观察者模式是一种常用的设计模式它属于行为型模式。在C#中观察者模式通过定义一种一对多的依赖关系使得当一个对象的状态发生变化时所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现松耦合使得被观察者和观察者之间的关系更加灵活。 在C#中实现观察者模式通常需要以下几个角色 1. Subject主题被观察者它维护了一个观察者列表并提供了添加、删除和通知观察者的方法。 2. Observer观察者观察者它定义了一个更新方法用于接收被观察者发出的通知。 3. ConcreteSubject具体主题具体的被观察者它继承或实现了主题接口并实现了具体的业务逻辑。它会在自身状态发生变化时通知观察者。 4. ConcreteObserver具体观察者具体的观察者它继承或实现了观察者接口并实现了更新方法。当接收到被观察者的通知时它会执行相应的逻辑。 通过使用观察者模式我们可以实现对象之间的解耦使得它们之间的依赖关系更加灵活和可扩展。这种模式在事件处理、GUI开发以及许多其他场景中都有广泛应用。 观察者模式的优点和缺点 观察者模式的优点 1. 松耦合被观察者和观察者之间的关系是松耦合的它们可以独立变化而互不影响。 2. 可扩展性可以方便地增加新的观察者或者在不影响现有代码的情况下增加新的被观察者。 3. 易于维护观察者模式将业务逻辑分散到各个观察者中使得代码更加清晰、易于维护。 4. 支持广播通信被观察者可以同时通知多个观察者实现广播式的通信。 观察者模式的缺点 1. 观察者过多时的性能问题如果观察者过多或者观察者的更新操作比较耗时可能会影响系统的性能。 2. 循环依赖问题观察者和被观察者之间存在循环依赖的情况下可能导致系统出现问题。 3. 更新顺序不确定观察者模式中观察者的更新顺序是不确定的可能会导致一些意外的结果。 观察者模式适用于以下场景 1. 当一个对象的状态变化需要通知其他多个对象并且这些对象的行为需要根据该状态变化做出相应的调整时可以使用观察者模式。 2. 当一个对象需要在不知道有多少个其他对象关注它的情况下动态地将消息通知给这些对象时可以使用观察者模式。 3. 当一个对象的改变需要同时影响其他多个对象并且它不希望与这些对象形成紧耦合关系时可以使用观察者模式。 4. 当系统中的某个对象需要与其他多个对象进行解耦以降低对象之间的依赖性时可以使用观察者模式。 5. 当需要实现事件驱动的系统或者消息通知机制时可以使用观察者模式。 观察者模式适用于多个对象之间存在一对多的依赖关系当一个对象的状态发生变化时需要通知其他多个对象进行相应的处理。它能够实现对象之间的解耦提高系统的灵活性和可扩展性。 二、代码实现 新建一个控制台项目 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 观察者模式 {internal class Program{static void Main(string[] args){ConcreteSubject subject new ConcreteSubject();ConcreteObserver observer1 new ConcreteObserver(Observer 1, subject);ConcreteObserver observer2 new ConcreteObserver(Observer 2, subject);ConcreteObserver observer3 new ConcreteObserver(Observer 3, subject);subject.AddObserver(observer1);subject.AddObserver(observer2);subject.AddObserver(observer3);subject.State 1; // 触发通知subject.RemoveObserver(observer2);subject.State 2; // 触发通知Console.ReadKey();}}// 主题接口public interface ISubject{void AddObserver(IObserver observer);void RemoveObserver(IObserver observer);void NotifyObservers();}// 具体主题public class ConcreteSubject : ISubject{private ListIObserver observers new ListIObserver();private int state;public int State{get { return state; }set{state value;NotifyObservers();}}public void AddObserver(IObserver observer){observers.Add(observer);}public void RemoveObserver(IObserver observer){observers.Remove(observer);}public void NotifyObservers(){foreach (IObserver observer in observers){observer.Update();}}}// 观察者接口public interface IObserver{void Update();}// 具体观察者public class ConcreteObserver : IObserver{private string name;private ConcreteSubject subject;public ConcreteObserver(string name, ConcreteSubject subject){this.name name;this.subject subject;}public void Update(){Console.WriteLine($Observer {name} received an update. New state: {subject.State});}} }运行 三、解析代码 上面的代码看起来比较复杂在23个设计模式中其实还不算最复杂的看多了习惯就好下面大致的讲下代码逻辑。 首先是定义了一个接口 ISubject它有三个方法添加观察者移除观察者通告观察者。 然后 ConcreteSubject 继承了这个接口这里重点在 state 这个属性这里 public int State {get { return state; }set{state value;NotifyObservers();} } 如果设置属性的值就会调用 NotifyObservers 方法这是个通知所有观察者的一个方法。 ConcreteObserver 存储了 name 和 具体观察者 ConcreteSubject 的实例具体的主题不过这里只是用到了打印 subject.State 并无其他作用。 Console.WriteLine($Observer {name} received an update. New state: {subject.State}); 在 ConcreteSubject.AddObserver 方法的参数是一个 IObserver 接口其实传递的就是 ConcreteObserver 实例这里由于只需要调用 Update 方法所以只用到了一个接口 IObserver虽然保护了 ConcreteObserver 类的开放权限但使的整个过程看起来更加复杂了。 从工作的角度来说上面的很多写法并不是那么推荐将简单的事情复杂化是在自己在刁难自己还可能会导致更多的 bug可别忘了公司里还有项目经理老板他们可是一直在催你快点做他们可不管你代码写的怎么样他们根本就不懂代码。 在 Main 函数中实例化了三个 ConcreteObserver 类并传入了 name , 并添加到了 subject 中这就是添加了三个观察者以便后面用消息来通知他们 在设置 subject.State 1 时默认就调用了 NotifyObservers 方法也就调用了三个观察者的 Update 方法理解了就会发现这些代码其实没有那么难。 四、案例 下面的代码来源博客 JiYF大男孩写的很不错拿来做个参考链接在下面 https://www.cnblogs.com/JiYF/p/6896458.html 新建类 Blog using System.Collections.Generic;/// summary /// 订阅者接口 /// /summary public interface IObserver {void Receive(Blog blog); }/// summary /// 订阅博客抽象类 /// /summary public abstract class Blog {/// summary /// 保存订阅者列表 /// /summary private ListIObserver observers new ListIObserver();/// summary /// 博主名 /// /summary public string BlogName { get; set; }/// summary /// 博客标题 /// /summary public string BlogTitle { get; set; }/// summary /// 博客信息 /// /summary public string BlogInfo { get; set; }/// summary /// 博客构造函数 /// /summary /// param nameblogTitle博客标题/param /// param nameblogInfo博客信息/param public Blog(string name, string blogTitle, string blogInfo){this.BlogName name;this.BlogTitle blogTitle;this.BlogInfo blogInfo;}/// summary /// 添加一个订阅者 /// /summary /// param nameobserver具体的订阅者对象/param public void AddObserver(IObserver observer){if (observers.Contains(observer)){return;}observers.Add(observer);}/// summary /// 删除一个订阅者 /// /summary /// param nameobserver具体的订阅者对象/param public void RemoveObserver(IObserver observer){if (observers.Contains(observer)){observers.Remove(observer);}}/// summary /// 发布博客通知 /// /summary public void PublishBlog(){//遍历通知每一个订阅者 foreach (IObserver ob in observers){if (ob ! null){// 调用继承当前接口的Receive方法 ob.Receive(this);}}} } 新建类 JiYFBlog namespace 设计模式_观察者模式 {/// summary /// 具体的订阅博客类 /// /summary public class JiYFBlog : Blog{public JiYFBlog(string name, string blogTitile, string blogInfo): base(name, blogTitile, blogInfo){}} } 新建类 Observer using System;namespace 设计模式_观察者模式 {/// summary /// 具体的订阅者类 /// /summary public class Observer : IObserver{/// summary /// 订阅者名字 /// /summary private string m_Name;public string Name{get { return m_Name; }set { m_Name value; }}/// summary /// 订阅者构造函数 /// /summary /// param namename订阅者名字/param public Observer(string name){this.m_Name name;}/// summary /// 订阅者接受函数 /// /summary /// param nameblog/param public void Receive(Blog blog){Console.WriteLine(订阅者:\{0}\观察到了:{1}发布的一篇博客,标题为:{2},内容为:{3}, Name, blog.BlogName, blog.BlogTitle, blog.BlogInfo);}} } 调用方法 using System;namespace 设计模式_观察者模式 {internal class Program{static void Main(string[] args){Console.WriteLine(--全部订阅者--);// 创建一个 JiYF 的博客 // 多态的方式发布一条播客但此时还没有订阅者 Blog jiyfBlog new JiYFBlog(JiYF笨小孩, 丑小鸭, 丑小鸭的故事);// 创建订阅者 Observer obsZhangsan new Observer(张三);Observer obsLiSi new Observer(李四);Observer obsWangwu new Observer(王五);// 添加到 JiYF 博客的订阅者 jiyfBlog.AddObserver(obsZhangsan);jiyfBlog.AddObserver(obsLiSi);jiyfBlog.AddObserver(obsWangwu);//通知订阅者 jiyfBlog.PublishBlog();Console.WriteLine();Console.WriteLine(--移除订阅者张三--);jiyfBlog.RemoveObserver(obsZhangsan);jiyfBlog.PublishBlog();Console.ReadLine();}} } 运行 end
http://www.zqtcl.cn/news/230871/

相关文章:

  • 响应式网站 有哪些弊端可以发广告的网站
  • wordpress 漫画站wordpress加目录
  • 天津商城网站制作深圳品牌网站设计公司
  • 初学网站开发上海市普陀区建设规划局网站
  • 网站开发完成后如何发布做网站用vs还是dw
  • 怎么看网站是否备案可信赖的菏泽网站建设
  • 做网站的优点系统软件开发服务
  • 深圳品牌营销网站建设尚品中国网站
  • 新建网站怎么做关键词南阳手机网站制作
  • 宁波网站建设应届生公司网站备案需要每年做吗
  • 汽车设计网站论坛网站 备案
  • 网站源码带手机版展示型网站首页设计解析
  • 备案的网站名称能重复备案吗为什么打开Wordpress很慢
  • vps网站建设个人网站二级域名做淘宝客
  • 用cms织梦做网站图文教程wordpress分类文章排序
  • 台州网站策划云南招聘网
  • 网站如何设定关键词wordpress 文章关联
  • 京津冀网站建设公司建设监理工程师网站
  • 网站建设的500字小结那些网站做网批
  • 怎么做视频网站首页网站建设公司创业计划书
  • 网加思维做网站推广项目营销推广策划
  • 郫县专业的网站建设免费自己创建个人网站
  • 网站建设公司比较扑克直播软件app开发
  • 天津武清做网站如何搭建自己的微信小程序商城
  • 网站排行榜海珠商城网站建设
  • 太原自助建站怎么提高网站加载速度慢
  • 网站如何做友情链接html5 视频网站 模板
  • 沈阳做网站哪家质量好价格低东单网站建设
  • o2o网站建设如何南宁网站推广方案如何做
  • 网站部署到终端机怎么做网站建设数据库怎么弄