Skip to content

前端设计模式

1. 策略模式

策略模式是一种行为设计模式,它定义了一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。此模式让算法的变化独立于使用算法的客户。

策略模式解决的问题是:

  1. 消除条件分支:策略模式允许你避免在代码中使用多重条件语句(如 if-else 或 switch),通过将行为抽象成策略类,让算法的变化不会影响到使用算法的上下文。
  2. 提供开闭原则的支持:策略模式遵循开闭原则,即对扩展开放,对修改封闭。这意味着可以新增策略类而无需修改使用策略的已有代码。
  3. 使算法可复用:通过将算法封装在策略类中,可以在不同的上下文中复用这些策略。
  4. 使算法可替换:策略模式让算法的替换变得简单,只需要改变上下文中的策略对象即可。

使用策略模式的好处:

  1. 可以避免多重条件选择语句
  2. 可以方便地更换和扩展算法,无需修改原代码,符合“开闭原则”
  3. 把算法的实现和使用分离,符合“单一职责原则”

策略模式常见的应用场景:

  1. 多种算法变体:当你的应用程序需要使用多种算法或行为,并且它们经常发生变化时,策略模式可以帮助你管理这些算法。
  2. 算法需要被不同对象共享:当多个对象需要使用相同的算法或行为时,使用策略模式可以避免代码重复。
  3. 算法需要根据运行时条件变化:如果算法的选择取决于运行时的某些条件,策略模式可以让算法的切换变得灵活。
  4. 需要简化条件语句的复杂类:如果某个类中包含复杂的条件语句来选择算法,使用策略模式可以简化这个类,让它只负责管理策略对象的切换。

示例:

如今各个网站(譬如掘金,QQ 客户端,CSDN,微信客户端,知乎等)在跳转到其他网站的时候都新增了二次确认拦截,我们需要一个通用的跳转方法[1],

由于我们不知道要自动跳转什么域名的网页,所以在不使用策略模式的条件下, 我们只能写很多的 if elseif 来处理不同网站的跳转逻辑,我想不需要太多的思考,大家脑海中已经想象出了那将是海量的条件判断了

所以使用策略模式来处理当前的需求是非常合适的,因为它的特点就是不仅可以避免多重条件选择语句,同时方便的扩展算法,而且配置扩展不会影响原跳转方法

2. 代理模式

代理模式是一种结构型设计模式,它允许你为其他对象提供代理或占位符以控制对这个对象的访问。代理对象与实际对象实现相同的接口,使得代理对象可以在客户端无感的情况下替换实际对象。

代理模式解决的主要问题是:

  1. 控制访问:代理可以控制对真实对象的访问,比如进行权限校验。
  2. 降低复杂度:代理可以提供简单的接口来访问复杂的对象,从而降低系统的复杂性。
  3. 增强功能:代理可以在客户端不知情的情况下增加额外的操作,如日志记录、缓存等。
  4. 保护真实对象:代理可以保护真实对象不暴露给不信任的客户端,防止外部对真实对象的直接操作。
  5. 远程代理:代理可以实现远程服务调用,对客户端透明。

使用代理模式的主要好处是:

  1. 可以在访问对象前后增加额外的操作,起到保护、优化的作用
  2. 代理对象作为访问对象的中介,保护了真实对象,并可以操作真实对象
  3. 符合开闭原则,增加代理类不需要修改原代码

代理模式使用场景:

  1. 操作一个对象比较消耗资源,可以使用代理预加载
  2. 对象的生命周期需要精确控制
  3. 对象只能在某些客户端中可见或者可操作
  4. 需要增加一个中间访问层来做验证、日志等操作

例如,图片预加载代理,文件上传代理,授权验证代理等都是代理模式非常实用的应用场景。

总体来说,代理模式通过提供代理类控制了对真实主题对象的访问,具有很强的实用性。

3. 适配器模式

适配器模式是一种结构型设计模式,它允许不兼容接口的类一起工作。适配器模式通过将一个类的接口转换成客户端期望的另一个接口,使得原本因接口不兼容而不能一起工作的类可以一起工作。

适配器模式解决的主要问题是:

  1. 兼容性:使得原本因接口不兼容而不能一起工作的类可以一起工作。
  2. 复用性:可以让现有类得到复用,而不是修改这些类来适应新的接口。
  3. 灵活性:可以在不修改原有代码的情况下,增加新的接口功能。

适配器模式使用场景:

  1. 封装旧代码:当你想使用某个类,但是它的接口与其他代码不兼容时,可以使用适配器模式。
  2. 适配不同库或框架:当你的系统中使用了多个库或框架,而这些库或框架的接口不兼容时,可以使用适配器模式。
  3. 统一多个类的接口:当你的系统中存在多个类,它们的接口不统一,可以使用适配器模式来统一接口。

适配器模式在处理遗留代码、集成第三方库或框架时非常有用。它允许你将不兼容的代码集成到你的系统中,而不需要改变现有的代码结构。

TIP

TODO: 有空补全各个设计模式的最简示例代码


  1. 免责声明:跳转拦截插件的作者仅仅是为了方便用户快速访问链接而开发了该插件,对于跳转后的网页安全性不做任何保证。用户在使用该插件时应自行承担风险并注意保护自己的设备和个人信息安全。 👈🏻