博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript基础学习——设计模式
阅读量:3915 次
发布时间:2019-05-23

本文共 2748 字,大约阅读时间需要 9 分钟。

一、设计模式意义:是让代码更加工程化。

二、设计模式的构成:

(1)模式名称:模式的一个好记的名字。

(2)环境和问题:描述在什么环境下,出现什么特定的问题。
(3)解决方案:描述如何解决问题。
(4)效果:描述应用模式后的效果,以及可能带来的问题。

三、设计模式

1、单例模式:单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点

(1)优点:可以来划分命名空间,从而清除全局变量所带来的危险。利用分支技术来封装浏览器之间的差异。可以把代码组织的更为一体,便于阅读和维护。

(2)缺点:可能导致模块间的强耦合。

(3)应用场景:单例模式在我们平时的应用中用的比较多的,相当于把我们的代码封装在一个函数中,只是暴露一个入口,从而避免全局变量的污染。

(4)单例模式目的:用来封装代码,减少全局变量的使用。

(5)特点:一个构造函数只有一个实例;只暴露一个入口。

  
Document

2、装饰器模式

装饰器模式在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象。

(1)优点:

不修改原对象的原本结构来进行功能添加。

装饰对象和原对象具有相同的接口,可以使客户以与原对象相同的方式使用装饰对象。
装饰对象中包含原对象的引用,即装饰对象为真正的原对象在此包装的对象。

(2)缺点:

在遇到用装饰器包装起来的对象时,那些依赖于类型检查的代码会出问题。

使用装饰器模式往往会增加架构的复杂程度。

(3)应用场景:如果需要为类增添特性或职责,而从该类派生子类的解决办法并不实际的话,就应该使用装饰器模式。

  
Document

3、适配器模式

适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性)。

(1) 优点:适配器有助于避免大规模改写现有客户的代码。其工作机制是,用一个新的接口对现有类的接口进行包装。

(2)缺点:如果现有API还未定形或新接口还未定形,那么适配器可能不会一直管用。

与装饰器模式的区别:适配器模式能模拟实现简单的装饰模式的功能,也就是为已有功能增添功能。

两个模式有一个很大的不同:一般适配器适配过后是需要改变接口的,如果不改接口就没有必要适配了;而装饰模式是不改变接口的,无论多少层装饰都是一个接口。因此装饰模式可以很容易地支持递归组合,而适配器就做不到,每次的接口不同,无法递归。

(3)适用场合:适配器适用于客户系统期待的接口与现有API提供的接口不兼容这种场合。它只能用来协调语法上的差异问题。适配器所适配的两个方法执行的应该是类似的任务,否则的话它就解决不了问题。

  
Document

4、观察者模式(发布/订阅模式)

观察者模式定义了对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,完成自动更新。观察者模式属于行为型模式,或者叫“发布/订阅模式”。

观察者模式中存在两个角色:观察者和被观察者,又叫发布者和订阅者。

观察者模式的调用顺序:

1. 准备阶段(维护目标和观察者关系的阶段)

⑴ 创建目标对象
⑵ 创建观察者
⑶ 向目标对象注册观察者对象

2. 运行阶段

⑴ 改变目标对象的状态
⑵ 通知所有注册的观察者对象进行相应的处理
⑶ 回调目标对象,获取相应的数据

优点:

① 观察者模式实现了观察者和目标之间的抽象耦合
② 观察者模式实现了动态联动
③ 观察者模式支持广播通信

缺点:可能会引起无谓的操作。

适用场景:当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化,那么就可以选用观察者模式。

  
Document

今天的发布/订阅模式发生一些变化。发布者和订阅者不直接发生联系,而是通过消息中心或中间件来发生联系。

  
Document

5、策略模式

定义一系列的算法,把它们封装起来,并且使它们可以相互替换。

优点:

① 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句。
② 策略模式提供了开放-封闭原则,使代码更容易理解和扩展。
③ 策略模式中的代码可以复用。

策略模式指的是定义一系列的算法,并且把它们封装起来,但是策略模式不仅仅只封装算法,我们还可以对用来封装一系列的业务规则,只要这些业务规则目标一致,我们就可以使用策略模式来封装它们。

  
Document

6、模板模式(也叫模板方法)

定义一个操作中的算法骨架,而将一些步骤延迟到子类中(不一样的某些方法在子类重新定义)。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。

主要解决:定义通用方法,却在子类中重写这一方法。

优点:

(1)封装不变的部分,扩展可变的部分。
(2)提取公共代码,便于维护。
(3)行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景:

(1)有多个子类共有的方法,且逻辑相同。
(2)重要的、复杂的方法,可以考虑作为模板方法。

  
Document

钩子(Hook)操作:它提供了缺省的行为,子类在必要时进行扩展。

  
模板模式

模板模式和策略模式的区别:模板方法使用继承来改变算法的一部分,而策略模式使用委托来改变整个算法。

7、代理模式

为其它对象提供一种代理以控制这个对象的访问。

使用场景:

(1)远程代理,也就是为了一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实,就像web service里的代理类一样。
(2)虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,比如浏览器的渲染的时候先显示问题,而图片可以慢慢显示(就是通过虚拟代理代替了真实的图片,此时虚拟代理保存了真实图片的路径和尺寸。
(3)安全代理,用来控制真实对象访问时的权限,一般用于对象应该有不同的访问权限。
(4)智能指引,只当调用真实的对象时,代理处理另外一些事情。

  
Document

8、外观模式

为多个接口提供一个统一接口的界面。主要用于处理浏览器的兼容问题(来做一些兼容性的封装处理)。

缺点:外观模式被开发都连续使用时会产生一定的性能问题,因为在每次调用时都要检测功能的可用性。

  
外观模式
外观模式开发

 

转载地址:http://lfvrn.baihongyu.com/

你可能感兴趣的文章
龙芯开源社区上线.NET主页
查看>>
eShopOnContainers 知多少[11]:服务间通信之gRPC
查看>>
闲谈设计模式
查看>>
平台or职位,你怎么选?
查看>>
骚年快答 | 技术中台与业务中台都是啥?
查看>>
骚年快答 | 微服务架构中的BFF到底是啥?
查看>>
设计模式之适配器模式
查看>>
如何利用Gitlab-CI持续部署到远程机器?
查看>>
.NET Core + K8S + Loki 玩转日志聚合
查看>>
ASP.NET Core中的分布式缓存
查看>>
在ASP.NET Core中创建自定义端点可视化图
查看>>
继续分享 5 个实用的 vs 调试技巧
查看>>
五年了,别再把务虚会开 “虚” 了
查看>>
一文看懂"async"和“await”关键词是如何简化了C#中多线程的开发过程
查看>>
每天都在支付,你真的了解信息流和资金流?
查看>>
.Net Core 自定义配置源从配置中心读取配置
查看>>
基于.NetCore3.1系列 —— 日志记录之日志配置揭秘
查看>>
设计模式之享元模式
查看>>
单例模式最佳实践
查看>>
.NET Core + Spring Cloud:服务注册与发现
查看>>