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

临沂网站建设哪家好杭州网站改版

临沂网站建设哪家好,杭州网站改版,上饶seo博客,优改网logo设计免费官网入口一、引言 相信猿友都大大小小经历过一些面试#xff0c;其中有道经典题目#xff0c;场景是猫咪叫了一声#xff0c;老鼠跑了#xff0c;主人被惊醒#xff08;设计有扩展性的可加分#xff09;。对于初学者来说#xff0c;可能一脸懵逼#xff0c;这啥跟啥啊是#x… 一、引言 相信猿友都大大小小经历过一些面试其中有道经典题目场景是猫咪叫了一声老鼠跑了主人被惊醒设计有扩展性的可加分。对于初学者来说可能一脸懵逼这啥跟啥啊是其实博主当年也这感觉O(∩_∩)O哈哈~好了废话不多说今天我们要学习的内容就是要解决这种业务场景——观察者模式又叫发布-订阅Publish/Subscrible模式 二、观察者模式 定义观察者模式定义了一种一对多的依赖关系让多个观察者对象同时监听某一个主题对象。这个主题对象状态发生变化时会通知所有观察者对象使它们能够自行更新自己 下面是观察者模式结构图                           该图示出自“大话设计模式” 下面通过大家都熟悉的生活场景来帮助我们一步步了解观察者模式 场景上自习课的时候困了想睡觉通常是会跟同桌说“老师来了叫我下我睡会”。大多数人都是这样吧嘿嘿 下面是代码demo //主题类class ConcreteSubject{private IListConcreteObserver lstConcreteObserver new ListConcreteObserver();private string action;//添加观察者public void Add(ConcreteObserver concreteObserver){lstConcreteObserver.Add(concreteObserver);}//移除观察者public void Remove(ConcreteObserver concreteObserver){lstConcreteObserver.Remove(concreteObserver);}//通知观察者类public void Notify(){foreach (ConcreteObserver observer in lstConcreteObserver){observer.Update();}}//定义主题发现的某一状态public string ConcreteAction{get { return action; }set { action value; }}}//观察者类class ConcreteObserver{protected ConcreteSubject subject;protected string name;public ConcreteObserver(ConcreteSubject subject, string name){this.subject subject;this.name name;}//观察者更新行为public void Update(){Console.WriteLine(${subject.ConcreteAction},{name}别睡觉了快醒醒);}}static void Main(string[] args){ConcreteSubject subject new ConcreteSubject();ConcreteObserver observer new ConcreteObserver(subject, michael);subject.Add(observer);subject.ConcreteAction 老师来了;subject.Notify();Console.Read();} View Code 分析乍一看是写的不错实现了老师来时同桌通知michael但是仔细想一下假如现在情况变了同桌另一边的同学在打游戏也让老师来时通知一下怎么办这时我们就需要去修改ConcreteSubject类中对观察者ConcreteObserver的引用还有另外一种情况假如某天同桌请假了通常会让前后排的同学通知观察者即修改观察者类ConcreteObserver中对ConcreteSubject的引用。这种相互耦合的设计显然是不太好当场景变了的时候不得不去修改原有代码违背了开放-封闭原则。 下面看一下大话设计模式中的例子是如何介绍观察者模式的 //抽象观察者类abstract class Observer{public abstract void Update();}//抽象主题类abstract class Subject{private IListObserver lstConcreteObserver new ListObserver();public void Add(Observer concreteObserver){lstConcreteObserver.Add(concreteObserver);}public void Remove(Observer concreteObserver){lstConcreteObserver.Remove(concreteObserver);}public void Notify(){foreach (Observer observer in lstConcreteObserver){observer.Update();}}}//具体观察者类class ConcreteObserver:Observer{protected ConcreteSubject subject;protected string name;private string observerState;public ConcreteObserver(ConcreteSubject subject, string name){this.subject subject;this.name name;}public override void Update(){this.observerState subject.ConcreteAction;Console.WriteLine($the observers of {name} state is {observerState});}}//具体主题对象class ConcreteSubject:Subject{ private string action; public string ConcreteAction{get { return action; }set { action value; }}}static void Main(string[] args){ConcreteSubject subject new ConcreteSubject();subject.Add(new ConcreteObserver(subject, michael));subject.Add(new ConcreteObserver(subject, jarle));subject.Add(new ConcreteObserver(subject, cumming));subject.ConcreteAction Ready;subject.Notify();Console.Read();} View Code  分析这次是不是可扩展性更高了嗯是的。观察者与主题对象都依赖于抽象而不依赖与具体使得各自变化都不会影响到另一边 其实现在已经很好了但是这样具体的观察者都要依赖于观察者的抽象那能不能再进行优化一次呢答案是完全可以的。 下面我们用委托事件来解决开头那个考烂了的面试题解释如何优化的 委托是一种引用类型表示对具有特定参数列表和返回类型的方法的引用 class Mao{private string name;public delegate void MaoDelegateHandler();public event MaoDelegateHandler MaoEventHandler;public Mao(string name){this.name name;}public void Miao(){Console.WriteLine(${this.name}叫了一声);Notify();}public void Notify(){if (MaoEventHandler ! null)MaoEventHandler();}public string Name{get { return name; }set { name value; }}}class Laoshu{public void Run(){Console.WriteLine(老鼠逃跑了);}}class People{public void Wake(){Console.WriteLine(主人被惊醒了);}}class Program{static void Main(string[] args){Mao mao new Mao(大脸猫);Laoshu laoshu new Laoshu();People people new People();//注册事件 这两种方式都可以mao.MaoEventHandler new Mao.MaoDelegateHandler(laoshu.Run);mao.MaoEventHandler people.Wake;//猫叫了一声 会自动调用注册过的方法mao.Miao();Console.Read();}} View Code 分析用委托事件来实现发布者和订阅者之间没有耦合是不是有优化了一步呢O(∩_∩)O~ 优点 1.观察者模式解除了发布者和订阅者的耦合两者都依赖于抽象而不是具体的使得两者可以各自独立的变化 缺点 1.观察者对象如果很多的话被观察者通知会耗时增多 2.在被观察者之间如果有相互依赖的话会相互调用导致系统崩溃小白注意 适用场景 1.当一个对象改变需要改变其它对象时而且不知道有多少个对象需要改变 2.当一个抽象模型有两个方面一个方面依赖于另一个方面将两者封装在独立的对象中以使它们可以各自独立的变化和复用   介绍到这里其实观察这模式已经结束了但是我觉得很多小白搞不懂winform开发程序中的grid单击、双击等事件方法后面的参数sender和e分别是什么。。。下面再简要分析一下 class Mao{private string name;//声明委托public delegate void MaoDelegateHandler(object sender, MaoEventArgs e);//声明事件public event MaoDelegateHandler MaoEventHandler;public class MaoEventArgs : EventArgs{private string name;public MaoEventArgs(string name){this.name name;}}public Mao(string name){this.name name;}//发布者 某一行为后 发出通知public void Miao(){Console.WriteLine(${this.name}叫了一声);//建立MaoEventArgs对象MaoEventArgs e new MaoEventArgs(this.Name);//调用通知方法Notify(e);}public void Notify(MaoEventArgs e){//如果有订阅者注册if (MaoEventHandler ! null)//执行所有注册的方法MaoEventHandler(this,e);}public string Name{get { return name; }set { name value; }}}class Laoshu{//是不是很熟悉,请自行脑补winfom中grid的事件及sender和e是什么public void Run(object sender,Mao.MaoEventArgs e){Mao mao (sender as Mao);Console.WriteLine(${mao.Name}来了老鼠逃跑了);}}class People{public void Wake(object sender, Mao.MaoEventArgs e){Mao mao (sender as Mao);Console.WriteLine(${mao.Name}的主人被惊醒了);}}class Program{static void Main(string[] args){Mao mao new Mao(大脸猫);Laoshu laoshu new Laoshu();People people new People();//注册事件 这两种方式都可以mao.MaoEventHandler new Mao.MaoDelegateHandler(laoshu.Run);mao.MaoEventHandler people.Wake;//猫叫了一声 会自动调用注册过的方法mao.Miao();Console.Read();}} View Code 分析ok这下面试的时候再也不怕面试官问你观察者模式相关知识了吧。。。   本文版权归作者和博客园共有欢迎转载但未经作者同意必须保留此段声明且在文章页面明显位置给出原文连接。 转载于:https://www.cnblogs.com/jdzhang/p/7397544.html
http://www.pierceye.com/news/694816/

相关文章:

  • 东莞做网站卓诚网络免费大数据分析网站
  • 网站用什么图片格式好seo学徒招聘
  • 地区网站建设网站用户反馈
  • 网站备案背景幕布下载成都最好的seo外包
  • 荆州 商务 网站建设郑州网站建设灵秀
  • 重庆市建筑工程信息官方网站注册号域名后如何建设公司网站
  • 江门网站建设junke100深圳小企业网站建设设计制作
  • 个人域名能做网站吗江苏外贸型网站制作
  • 文登区做网站的公司琴行网站开发学术论文
  • 嵌入式网站开发学习百度seo优化收费标准
  • 网站评价及优化分析报告湖南省邵阳建设局网站
  • 网站推广是做什么的深圳市住房建设与保障局官方网站
  • qq群推广网站lamp网站开发制作
  • ui网站界面设计广州省建设监理协会网站
  • 网站界面设计教程宁波正规网站seo公司
  • 网站建设与管理中专上海注册公司注册地址
  • 清溪网站建设怎么用wordpress打开网站
  • 网站稳定性不好的原因wordpress仿站维护
  • 银行管理系统网站建设最专业的医疗网站建设
  • 网站应该怎么做住建官网查询
  • 建设网站类型条形码生成器在线制作图片
  • 邯郸广告公司网站建设seo排名怎么做
  • 大眼睛网站建设做艺术品的网站
  • 自助免费网站建设平台网站开发php还是jsp
  • 网站建设成本多少北京怎么进行网页设计
  • 给个网站做导航违法吗游戏推广员每天做什么
  • 交互式网站开发技术全国企业信用公示信息公示网官网
  • 大连网站设计公司排名班级优化大师的功能有哪些
  • 旅游网站建设的概念ppt模板自己制作
  • 重庆网站建设首选承越网站开发建设方案