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

广西建设监理协会网站阿里巴巴做网站分录

广西建设监理协会网站,阿里巴巴做网站分录,关于做芯片类招聘的网站,中国建设工程协会网站一. 观察者模式 1. 背景 在现实世界中#xff0c;许多对象并不是独立存在的#xff0c;其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如#xff0c;某种商品的物价上涨时会导致部分商家高兴#xff0c;而消费者伤心#xff1b;还有许多对象并不是独立存在的其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如某种商品的物价上涨时会导致部分商家高兴而消费者伤心还有当我们开车到交叉路口时遇到红灯会停遇到绿灯会行。这样的例子还有很多例如股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。 在软件世界也是这样例如Excel 中的数据与折线图、饼状图、柱状图之间的关系MVC 模式中的模型与视图的关系事件模型中的事件源与事件处理者。所有这些如果用观察者模式来实现就非常方便。 2. 定义和特点 (1). 定义 指多个对象间存在一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式它是对象行为型模式。 PS: 观察者模式是 【1对多】的关系后面的中介者模式是 【多对多】的关系。 (2). 优点 A. 降低了目标与观察者之间的耦合关系两者之间是抽象耦合关系。 B. 目标与观察者之间建立了一套触发机制。 (3). 缺点 A. 目标与观察者之间的依赖关系并没有完全解除而且有可能出现循环引用。 B. 当观察者对象很多时通知的发布会花费很多时间影响程序的效率。 3. 具体实现 (1). 模式结构 实现观察者模式时要注意具体目标对象和具体观察者对象之间不能直接调用否则将使两者之间紧密耦合起来这违反了面向对象的设计原则。 A. 抽象目标类它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法以及通知所有观察者的抽象方法。 B. 具体目标类也叫具体目标类它实现抽象目标中的通知方法当具体主题的内部状态发生改变时通知所有注册过的观察者对象。 C. 抽象观察者它是一个抽象类或接口它包含了一个更新自己的抽象方法当接到具体主题的更改通知时被调用。 D. 具体观察者实现抽象观察者中定义的抽象方法以便在得到目标的更改通知时更新自身的状态。 结构图如下 (2). 使用场景 老师向学生发通知老师是具体的目标类学生是具体的观察者。 (3). 代码实操 抽象观察者和具体的观察者(学生类) /// summary/// 抽象观察者/// /summarypublic interface IObserver{/// summary/// 接收通知/// /summary/// param namemsg/paramvoid ReceiveNotice(string msg);}/// summary/// 学生1/// (具体观察者)/// /summarypublic class StudentObserver1 : IObserver{public void ReceiveNotice(string msg){Console.WriteLine($学生1已经收到通知内容为{msg});}}/// summary/// 学生2/// (具体观察者)/// /summarypublic class StudentObserver2 : IObserver{public void ReceiveNotice(string msg){Console.WriteLine($学生2已经收到通知内容为{msg});}} 抽象目标类和具体目标类(老师类) /// summary/// 抽象目标/// (定义操作观察者的相关方法)/// /summarypublic abstract class AbstractSub{protected ListIObserver obList new ListIObserver();/// summary/// 增加观察者/// /summary/// param nameob/parampublic void AddOb(IObserver ob){if (!obList.Contains(ob)){obList.Add(ob);}}/// summary/// 删除观察者/// /summary/// param nameob/parampublic void RemoveOb(IObserver ob){if (obList.Contains(ob)){obList.Remove(ob);} }/// summary/// 通知具体观察者的方法/// /summarypublic abstract void notifyObserver(string msg);}/// summary/// 老师1/// 具体目标(发通知 发布者)/// /summarypublic class TeacherSub1 : AbstractSub{/// summary/// 实现通知学生的业务/// /summarypublic override void notifyObserver(string msg){foreach (var item in obList){//向每个学生(即观察者)发送通知//当观察者较多的时候此处考虑使用线程池item.ReceiveNotice(msg);}}} 测试 {//1. 声明所有学生类(观察者)IObserver student1 new StudentObserver1();IObserver student2 new StudentObserver2();//2. 声明老师类(发布者)AbstractSub teacher1 new TeacherSub1();teacher1.AddOb(student1);teacher1.AddOb(student2);//3.发送通知teacher1.notifyObserver(2020-08-13, 晚上8点全体开会哦);} 运行结果 4. 适用场景分析 (1). 对象间存在一对多关系一个对象的状态发生改变会影响其他对象。 (2). 当一个抽象模型有两个方面其中一个方面依赖于另一方面时可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 更多C后端开发技术点知识内容包括C/CLinuxNginxZeroMQMySQLRedisMongoDBZK流媒体音视频开发Linux内核TCP/IP协程DPDK多个高级知识点。 【文章福利】另外还整理一些C后台开发架构师 相关学习资料面试题教学视频以及学习路线图免费分享有需要的可以点击 C后端学习资料 免费领取 二. 中介者模式 1. 背景 在现实生活中常常会出现好多对象之间存在复杂的交互关系这种交互关系常常是“网状结构”它要求每个对象都必须知道它需要交互的对象。例如每个人必须记住他她所有朋友的电话而且朋友中如果有人的电话修改了他她必须告诉其他所有的朋友修改这叫作“牵一发而动全身”非常复杂。 如果把这种“网状结构”改为“星形结构”的话将大大降低它们之间的“耦合性”这时只要找一个“中介者”就可以了。如前面所说的“每个人必须记住所有朋友电话”的问题只要在网上建立一个每个朋友都可以访问的“通信录”就解决了。这样的例子还有很多例如你刚刚参力口工作想租房可以找“房屋中介”或者自己刚刚到一个陌生城市找工作可以找“人才交流中心”帮忙。 在软件的开发过程中这样的例子也很多例如在 MVC 框架中控制器C就是模型M和视图V的中介者还有大家常用的 QQ 聊天程序的“中介者”是 QQ 服务器。所有这些都可以采用“中介者模式”来实现它将大大降低对象之间的耦合性提高系统的灵活性。 2. 定义和特点 (1). 定义 定义一个中介对象来封装一系列对象之间的交互使原有对象之间的耦合松散且可以独立地改变它们之间的交互。中介者模式又叫调停模式它是迪米特法则的典型应用。 PS中介者模式是 【多对多】的关系上面的观察者模式是 【1对多】的关系。 (2). 优点 A. 降低了对象之间的耦合性使得对象易于独立地被复用。 B. 将对象间的多对多关联转变为一对一的关联提高系统的灵活性使得系统易于维护和扩展。 (3). 缺点 同事类太多时中介者的职责将很大它会变得复杂而庞大以至于系统难以维护 3. 具体实现 (1). 模式结构 A. 抽象中介者它是中介者的接口提供了同事对象注册与转发同事对象信息的抽象方法。 B. 具体中介者实现中介者接口定义一个 List 来管理同事对象协调各个同事角色之间的交互关系因此它依赖于同事角色。 C. 抽象同事类定义同事类的接口保存中介者对象提供同事对象交互的抽象方法实现所有相互影响的同事类的公共功能。 D. 具体同事类是抽象同事类的实现者当需要与其他同事对象交互时由中介者对象负责后续的交互。 结构图如下 (2). 使用场景 一个公司中不同部门的员工不允许直接对接这个时候需要一个中间人帮着沟通联系这个中间人就是中介者。 (3). 代码实操 抽象中介者和具体中介者 /// summary/// 抽象中介者/// /summarypublic abstract class AbstractMediator{//添加同事public abstract void AddColleague(AbstractColleague colleague);//消息转发public abstract void TransMsg(AbstractColleague cl,string msg); //转发}/// summary/// 具体中介者/// (用于协调转发各部门同事的信息传输)/// /summarypublic class Mediator1 : AbstractMediator{private ListAbstractColleague cList new ListAbstractColleague();/// summary/// 添加同事/// /summary/// param namecolleague/parampublic override void AddColleague(AbstractColleague colleague){if (!cList.Contains(colleague)){cList.Add(colleague);}}/// summary/// 消息转发(1对1)/// /summary/// param namecl/param/// param namemsg/parampublic override void TransMsg(AbstractColleague cl, string msg){foreach (var item in cList){if (item.Equals(cl)){item.ReceiveMsg(msg);}}}} 抽象同事类和具体同事类 /// summary/// 抽象同事类/// /summarypublic abstract class AbstractColleague{protected AbstractMediator _abstractMediator;public AbstractColleague(AbstractMediator abstractMediator){this._abstractMediator abstractMediator;}/// summary/// 收消息/// /summary/// param namemsg/parampublic abstract void ReceiveMsg(string msg);/// summary/// 发消息(这里指1对1)/// /summary/// param namemsg/parampublic abstract void SendMsg(AbstractColleague c, string msg);}/// summary/// 同事1(位于业务部门)/// /summarypublic class Colleague1 : AbstractColleague{public Colleague1(AbstractMediator meditor):base(meditor){}public override void ReceiveMsg(string msg){Console.WriteLine($同事1收到新消息,内容为:{msg});}public override void SendMsg(AbstractColleague c, string msg){//调用中介者进行消息转发_abstractMediator.TransMsg(c, msg);}}/// summary/// 同事2(位于技术部门)/// /summarypublic class Colleague2 : AbstractColleague{public Colleague2(AbstractMediator meditor) : base(meditor){}public override void ReceiveMsg(string msg){Console.WriteLine($同事2收到新消息,内容为:{msg});}public override void SendMsg(AbstractColleague c, string msg){//调用中介者进行消息转发_abstractMediator.TransMsg(c, msg);}}/// summary/// 同事3,位于行政部门/// /summarypublic class Colleague3 : AbstractColleague{public Colleague3(AbstractMediator meditor) : base(meditor){}public override void ReceiveMsg(string msg){Console.WriteLine($同事3收到新消息,内容为:{msg});}public override void SendMsg(AbstractColleague c, string msg){//调用中介者进行消息转发_abstractMediator.TransMsg(c, msg);}} 测试 {//1.声明中介者AbstractMediator aMediator new Mediator1();//2. 声明各业务同事AbstractColleague c1 new Colleague1(aMediator);AbstractColleague c2 new Colleague2(aMediator);AbstractColleague c3 new Colleague3(aMediator);//3.给中介者添加各个同事aMediator.AddColleague(c1);aMediator.AddColleague(c2);aMediator.AddColleague(c3);//4.开始信息交流Console.WriteLine(c1发消息给c2);c1.SendMsg(c2, 今晚一起吃饭吧);Console.WriteLine(c2发消息给c3);c3.SendMsg(c3, 明天8点一起开会);} 运行结果 4. 适用场景分析 (1). 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。 (2). 当想创建一个运行于多个类之间的对象又不想生成新的子类时。 原文链接https://www.cnblogs.com/yaopengfei/p/13502916.html
http://www.hkea.cn/news/14503093/

相关文章:

  • 上海单位网站建设nginx wordpress 主题
  • mvc中手把手做网站小程序appid格式
  • 建行信用卡网站官网入口自己用dw做网站要多久
  • 福田网站改版.net网站开发后编译
  • 南京企业网站制作价格怎么注册公司教程
  • 无锡富通电力建设有限公司网站站长工具推荐网站
  • 建简单网站便利的龙岗网站设计
  • 本地扬中网站建设2021年uc秒懂网址推荐
  • 企业建设网站的目标网站建设的资料的准备
  • 阿里云搭建公司网站中山网站只设计
  • 企业公司建网站的步骤4399游戏盒下载官方网站
  • 渭南网站建设seo未来最吃香的十大行业2022
  • 公司做年审在哪个网站基于ssh框架的网站开发流程
  • 免费建站平台的源码网站优化策略分析论文
  • 淄博比较好的网站建设公司建设银行mylove网站
  • 电子商务网站建设基础步骤网站设计建设公司联系方式
  • 商品展示网站源码wordpress 数据乱码
  • 做网站代理属于开设赌场罪吗福州思企互联网站建设公司怎么样
  • 天元建设集团有限公司北京分公司网站如何合理建设seo
  • 网站title keyword description网站建设的美图
  • 建站公司怎么备案深圳做电商平台网站建设
  • 怎么查网站的外链数量wordpress icomoon
  • 网站搭建报价单工作5年体重飙400斤
  • 网页策划书 网站建设定位南通哪里做网站
  • 如何做网站卖产品做网站职业咋样
  • 外贸网站定制开发公司请人做的网站打不开
  • 网站给他人做付刑事责任网站的文案
  • 淘宝网站建设可信吗收费网站空间
  • wordpress会员提成插件seo站长常用工具
  • 网站 微信如何查看网站开发者