首页 > 其他分享 >计算机基础_设计模式

计算机基础_设计模式

时间:2023-03-06 09:57:46浏览次数:48  
标签:订阅 计算机 对象 基础 观察者 模式 发布 发布者 设计模式

熟练使用前端常用的设计模式编写代码
如单例模式、装饰器模式、代理模式等

 

发布订阅模式和观察者模式的异同以及实际应用

一、定性区别

首先,观察者是经典软件设计模式中的一种,但发布订阅只是软件架构中的一种消息范式。所以不要再被“观察者模式和发布订阅模式xxx”这样的问题误导。

二、组成区别

 

 三、各自实现

可以看出,此时网站和用户间其实是有耦合的,也就是网站除了要维护自身功能外,还需要维护订阅者列表,并且在内容更新后完成通知工作。这样在用户和网站之间有一部分关系是维护在网站内部的。如果网站想把这部分任务抽离出来,自然便恢复至发布订阅模型,即建立单独的消息中心来管理发布者和订阅者之间的关系以及接收变化和通知消息的工作。

发布订阅的实现内部利用了观察者模式,让我们回顾一下观察者模式的核心,观察者模式由观察者和被观察者组成,其中被观察者是重点。二者的关联可以是在创建被观察者后,调用其添加观察者方法主动建立和某个观察者的关系,或是在创建观察者时即声明要观察的对象,即被观察者。其中观察者和被观察者一般为一对多关系,即一个被观察者可以被多个观察者观察。

那么分析发布订阅模型即可发现,其中订阅者发布订阅中心的关系类似观察者被观察者的关系。注意只是类似,因为虽然其中订阅者观察者都是消费的一方,期待能够即时接收到其他方的变化。

但区别在于观察者模式中的被观察者需要在每次自身改变后都绑定式地触发对观察者的通知,因为这是观察者模式这一模式所要实现的核心,也就是类似事件处理系统的机制,被观察者有义务针对自身的变化给出响应式的反馈到观察者们,这就是为什么说观察者模式是松耦合的,因为被观察者的功能不纯粹,要包含一部分观察者和自身关系的逻辑。

发布订阅与之的区别在于,因为发布者把消息通知的权限交由发布订阅中心管理,发布者只需关心自身的发布逻辑,而不会直接和其所发布内容的订阅者直接通信。订阅者也如此,其只关心向发布订阅中心注册自己想要接收通知的栏目,并实现自己在接收到通知后的逻辑,而无需关心消息来自何方,发布者是谁。因此发布者订阅者由于发布订阅中心的出现而完全解耦。

由于发布订阅中心这一中间层的出现,对于生产方和消费方的通信管理变得更加的可管理和可拓展。比如这样同样可以实现通过观察者模式实现的事件机制,即消息中心在接收到新的消息发布后即时通知到该类目下的所有订阅者,只不过此时的发布者消息中心的关系为一对一,并且消息中心订阅者一对多,消息中心只相当于发布者的一层代理。

 

四、实际应用

发布订阅模式实际应用
  • Node.js中自带的EventEmiter模块
  • Vue.js中数据响应式的实现

五、异同

  • 观察者模式里,只有两个角色 —— 观察者 + 被观察者
  • 而发布订阅模式里,却不仅仅只有发布者和订阅者两个角色,还有一个经常被我们忽略的 —— 经纪人Broker
  • 观察者和被观察者,是松耦合的关系
  • 发布者和订阅者,则完全不存在耦合
  • 观察者模式,多用于单个应用内部
  • 发布订阅模式,则更多的是一种跨应用的模式(cross-application pattern),比如我们常用的消息中间件

可以说出几种设计模式在开发中的实际应用,理解框架源码中对设计模式的应用

 

 

 JS 常用的六种设计模式介绍 - 掘金 (juejin.cn)

单例模式:vuex

优点: 节约资源,保证访问的一致性。

缺点: 扩展性不友好,因为单例模式一般自行实例化,没有接口。

 

工厂模式:根据不同的参数,返回不同类的实例。

将对象的创建与对象的实现分离。实现复杂,但使用简单。工厂会给我们提供一个工厂方法,我们直接去调用即可。

例子就是框架中在生成虚拟DOM的时候提供createElement来生成Vnode。

另外就是vue-router 中使用了工厂模式的思想来获得响应路由控制类的实例,this.history 用来保存路由实例。

优点:

  1. 良好的封装,访问者无需了解创建过程,代码结构清晰。
  1. 扩展性良好,通过工厂方法隔离了用户和创建流程,符合开闭原则。
  1. 解耦了高层逻辑和底层产品类,符合最少知识原则,不需要的就不要去交流;

缺点:

给系统增加了抽象性,带来了额外的系统复杂度,不能滥用。(合理抽象能提高系统维护性,但可能会提高阅读难度,还是需要合理看待)


代理模式 ES6里面的Proxy和Jquery.proxy
  • 代理模式能将代理对象与被调用对象分离,降低了系统的耦合度。代理模式在客户端和目标对象之间起到一个中介作用,这样可以起到保护目标对象的作用
  • 代理对象可以扩展目标对象的功能;通过修改代理对象就可以了,符合开闭原则
        适配器模式 例子:vue中的computed

适配器与代理模式相似

  • 适配器模式: 提供一个不同的接口(如不同版本的插头)
  • 代理模式: 提供一模一样的接口
用于解决兼容问题,接口/方法/数据不兼容,将其转换成访问者期望的格式进行使用。 例子:组件针对不同的数据来源分别采用不同的渲染。保持了组件的单一职责。

优点: 可以使原有逻辑得到更好的复用,有助于避免大规模改写现有代码;

缺点: 会让系统变得零乱,明明调用 A,却被适配到了 B,如果滥用,那么对可阅读性不太友好。

 

装饰器模式

在不改变原对象的基础上,增加新属性/方法/功能。

 

策略模式

定义一系列算法,根据输入的参数决定使用哪个算法。算法的实现和算法的使用分开

  • Context :封装上下文,根据需要调用需要的策略,屏蔽外界对策略的直接调用,只对外提供一个接口,根据需要调用对应的策略;
  • Strategy :策略,含有具体的算法,其方法的外观相同,因此可以互相代替;
  • StrategyMap :所有策略的合集,供封装上下文调用;

 

 观察者模式 一个对象(称为subject)维持一系列依赖于它的对象(称为observer),将有关状态的任何变更自动通知给它们(观察者)。   发布订阅模式      

标签:订阅,计算机,对象,基础,观察者,模式,发布,发布者,设计模式
From: https://www.cnblogs.com/alwaysrun/p/17182661.html

相关文章

  • 设计模式
    软件设计师:23种设计模式 总图创建型设计模式1.抽象工厂方法模式#代码packagenwnu.sun.patterns.createtype.abstractfactory;/***抽象工厂设计......
  • 计算机基础_WebSocket以及从URL到页面展示过程
    理解WebSocket协议的底层原理websocket本质上是一种计算机网络应用层的协议,用来弥补http协议在持久通信能力上的不足。虽然http有了keep-alive,但是本质上http请求还是请求......
  • 基础算法(1)
    快速排序(O(NlogN))思路:确定分界点(序列里随机一个数都可以):左边界、右边界、中值;调整范围;递归处理左、右两段核心:每次j指针落在i指针前面位置时,将q[i]、q[j]进行swap操作(先......
  • go项目 -- 即时通信系统V0.1 基础server构建
    跟着b站上刘丹冰Aceld大佬开始做go项目创建server结构体,要有server的Ip和Port两个变量typeServerstruct{ Ipstring Portint}创建一个server的接口func......
  • 计算机基础_网络协议2.TCP、HTTP、HTTPS
    三次握手和四次挥手详细原理,为什么要使用这种机制?当进行第一次握手,网络不好可能会堵塞,所以连接的请求并没有到达服务器端;但是tcp连接有超时重传的机制,所以再一次发送请求,......
  • salesforce零基础学习(一百二十六) Picklist Value Set 优缺点和使用探讨
    本篇参考:https://help.salesforce.com/s/articleView?id=sf.fields_creating_global_picklists.htm&type=5当我们创建Picklist字段时,比如很多表很多字段都会用到同样的p......
  • 数字电子技术基础系统方法笔记第一章
    1.1数字和模拟信号及系统模拟量具有连续的数值,数字量具有离散的数值。自然加中大多数可以测量的对象都是模拟量。example:模拟量:温度,湿度,压力,速度。数字量:计算机储存......
  • 设计模式-javascript实现【迭代器模式】
    定义:迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之......
  • 计算机基础_网络协议1.协议
    理解什么是协议?互联网的实现,分为好几层。每一层都是为了完成一种功能。为了实现这些功能,就需要大家都遵守共同的规则。大家都遵守的规则,就叫做"协议"了解TCP/IP网络协议......
  • Java基础随笔(2)static静态详解
    1packagecom.chapter;23classBowl{4Bowl(intmarker){5System.out.println("Bowl+("+marker+")");6}78voidf1(int......