iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >JS设计模式的六大原则是什么
  • 177
分享到

JS设计模式的六大原则是什么

2024-04-02 19:04:59 177人浏览 泡泡鱼
摘要

本篇内容主要讲解“js设计模式的六大原则是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS设计模式的六大原则是什么”吧!单一职责原则(SRP)单一功能原则

本篇内容主要讲解“js设计模式的六大原则是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS设计模式的六大原则是什么”吧!

单一职责原则(SRP)

单一功能原则 :单一功能原则 认为对象应该仅具有一种单一功能的概念。

换句话说就是让一个类只做一种类型责任,当这个类需要承担其他类型的责任的时候,就需要分解这个类。在所有的SOLID原则中,这是大多数开发人员感到最能完全理解的一条。严格来说,这也可能是违反最频繁的一条原则了。单一责任原则可以看作是低耦合、高内聚在面向对象原则上的引申,将责任定义为引起变化的原因,以提高内聚性来减少引起变化的原因。责任过多,可能引起它变化的原因就越多,这将导致责任依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一责任,通常意味着单一的功能,因此不要为一个模块实  现过多的功能点,以保证实体只有一个引起它变化的原因。

「不好的写法」

class UserSettings {   constructor(user) {     this.user = user;   }    changeSettings(settings) {     if (this.verifyCredentials()) {       // ...     }   }    verifyCredentials() {     // ...   } }

「好的写法」

class UserAuth {   constructor(user) {     this.user = user;   }    verifyCredentials() {     // ...   } }  class UserSettings {   constructor(user) {     this.user = user;     this.auth = new UserAuth(user);   }    changeSettings(settings) {     if (this.auth.verifyCredentials()) {       // ...     }   } }

开放闭合原则 (OCP)

软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这个原则是诸多面向对象编程原则中最抽象、最难理解的一个。

  • 通过增加代码来扩展功能,而不是修改已经存在的代码。

  • 若客户模块和服务模块遵循同一个接口来设计,则客户模块可以不关心服务模块的类型,服务模块可以方便扩展服务(代码)。

  • OCP支持替换的服务,而不用修改客户模块。

说大白话就是:你不是要变化吗?,那么我就让你继承实现一个对象,用一个接口来抽象你的职责,你变化越多,继承实现的子类就越多。

「不好的写法」

class ajaxAdapter extends Adapter {   constructor() {     super();     this.name = "ajaxAdapter";   } }  class nodeAdapter extends Adapter {   constructor() {     super();     this.name = "nodeAdapter";   } }  class HttpRequester {   constructor(adapter) {     this.adapter = adapter;   }    fetch(url) {     if (this.adapter.name === "ajaxAdapter") {       return makeAjaxCall(url).then(response => {         // transfORM response and return       });     } else if (this.adapter.name === "nodeAdapter") {       return makeHttpCall(url).then(response => {         // transform response and return       });     }   } }  function makeAjaxCall(url) {   // request and return promise }  function makeHttpCall(url) {   // request and return promise }

「好的写法」

class AjaxAdapter extends Adapter {   constructor() {     super();     this.name = "ajaxAdapter";   }    request(url) {     // request and return promise   } }  class NodeAdapter extends Adapter {   constructor() {     super();     this.name = "nodeAdapter";   }    request(url) {     // request and return promise   } }  class HttpRequester {   constructor(adapter) {     this.adapter = adapter;   }    fetch(url) {     return this.adapter.request(url).then(response => {       // transform response and return     });   } }

里氏替换原则(LSP)

里氏替换原则 :里氏替换原则 认为“程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的”的概念。

LSP则给了我们一个判断和设计类之间关系的基准:需不需 要继承,以及怎样设计继承关系。

当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。继承对于「OCP」,就相当于多态性对于里氏替换原则。子类可以代替基类,客户使用基类,他们不需要知道派生类所做的事情。这是一个针对行为职责可替代的原则,如果S是T的子类型,那么S对象就应该在不改变任何抽象属性情况下替换所有T对象。

客户模块不应关心服务模块的是如何工作的;同样的接口模块之间,可以在不知道服务模块代码的情况下,进行替换。即接口或父类出现的地方,实现接口的类或子类可以代入。

「不好的写法」

class Rectangle {   constructor() {     this.width = 0;     this.height = 0;   }    setColor(color) {     // ...   }    render(area) {     // ...   }    setWidth(width) {     this.width = width;   }    setHeight(height) {     this.height = height;   }    getArea() {     return this.width * this.height;   } }  class Square extends Rectangle {   setWidth(width) {     this.width = width;     this.height = width;   }    setHeight(height) {     this.width = height;     this.height = height;   } }  function renderLargeRectangles(rectangles) {   rectangles.forEach(rectangle => {     rectangle.setWidth(4);     rectangle.setHeight(5);     const area = rectangle.getArea(); // BAD: Returns 25 for Square. Should be 20.     rectangle.render(area);   }); }  const rectangles = [new Rectangle(), new Rectangle(), new Square()]; renderLargeRectangles(rectangles);

「好的写法」

class Shape {   setColor(color) {     // ...   }    render(area) {     // ...   } }  class Rectangle extends Shape {   constructor(width, height) {     super();     this.width = width;     this.height = height;   }    getArea() {     return this.width * this.height;   } }  class Square extends Shape {   constructor(length) {     super();     this.length = length;   }    getArea() {     return this.length * this.length;   } }  function renderLargeShapes(shapes) {   shapes.forEach(shape => {     const area = shape.getArea();     shape.render(area);   }); }  const shapes = [new Rectangle(4, 5), new Rectangle(4, 5), new Square(5)]; renderLargeShapes(shapes);

接口隔离原则(ISP)

接口隔离原则 :接口隔离原则 认为“多个特定客户端接口要好于一个宽泛用途的接口”的概念。

不能强迫用户去依赖那些他们不使用的接口。换句话说,使用多个专门的接口比使用单一的总接口总要好。

这个原则起源于施乐公司,他们需要建立了一个新的打印机系统,可以执行诸如装订的印刷品一套,传真多种任务。此系统软件创建从底层开始编制,并实现了这些  任务功能,但是不断增长的软件功能却使软件本身越来越难适应变化和维护。每一次改变,即使是最小的变化,有人可能需要近一个小时的重新编译和重新部署。这  是几乎不可能再继续发展,所以他们聘请罗伯特Robert帮助他们。他们首先设计了一个主要类Job,几乎能够用于实现所有任务功能。只要调用Job类的  一个方法就可以实现一个功能,Job类就变动非常大,是一个胖模型啊,对于客户端如果只需要一个打印功能,但是其他无关打印的方法功能也和其耦合,ISP  原则建议在客户端和Job类之间增加一个接口层,对于不同功能有不同接口,比如打印功能就是Print接口,然后将大的Job类切分为继承不同接口的子  类,这样有一个Print Job类,等等。

「不好的写法」

class DOMTraverser {   constructor(settings) {     this.settings = settings;     this.setup();   }    setup() {     thisthis.rootNode = this.settings.rootNode;     this.animationModule.setup();   }    traverse() {     // ...   } }  const $ = new DOMTraverser({   rootNode: document.getElementsByTagName("body"),   animationModule() {} // Most of the time, we won't need to animate when traversing.   // ... });

「好的写法」

class DOMTraverser {   constructor(settings) {     this.settings = settings;     this.options = settings.options;     this.setup();   }    setup() {     thisthis.rootNode = this.settings.rootNode;     this.setupOptions();   }    setupOptions() {     if (this.options.animationModule) {       // ...     }   }    traverse() {     // ...   } }  const $ = new DOMTraverser({   rootNode: document.getElementsByTagName("body"),   options: {     animationModule() {}   } });

依赖倒置原则(DIP)

依赖倒置原则:依赖倒置原则 认为一个方法应该遵从“依赖于抽象而不是一个实例” 的概念。依赖注入是该原则的一种实现方式。

依赖倒置原则(Dependency Inversion Principle,DIP)规定:代码应当取决于抽象概念,而不是具体实现。

  • 高层模块不要依赖低层模块

  • 高层和低层模块都要依赖于抽象;

  • 抽象不要依赖于具体实现

  • 具体实现要依赖于抽象

  • 抽象和接口使模块之间的依赖分离

类可能依赖于其他类来执行其工作。但是,它们不应当依赖于该类的特定具体实现,而应当是它的抽象。这个原则实在是太重要了,社会的分工化,标准化都  是这个设计原则的体现。显然,这一概念会大大提高系统的灵活性。如果类只关心它们用于支持特定契约而不是特定类型的组件,就可以快速而轻松地修改这些低级  服务的功能,同时最大限度地降低对系统其余部分的影响。

「不好的写法」

class InventoryRequester {   constructor() {     this.REQ_METHODS = ["HTTP"];   }    requestItem(item) {     // ...   } }  class InventoryTracker {   constructor(items) {     this.items = items;      // BAD: We have created a dependency on a specific request implementation.     // We should just have requestItems depend on a request method: `request`     this.requester = new InventoryRequester();   }    requestItems() {     this.items.forEach(item => {       this.requester.requestItem(item);     });   } }  const inventoryTracker = new InventoryTracker(["apples", "bananas"]); inventoryTracker.requestItems();

「好的写法」

class InventoryTracker {   constructor(items, requester) {     this.items = items;     this.requester = requester;   }    requestItems() {     this.items.forEach(item => {       this.requester.requestItem(item);     });   } }  class InventoryRequesterV1 {   constructor() {     this.REQ_METHODS = ["HTTP"];   }    requestItem(item) {     // ...   } }  class InventoryRequesterV2 {   constructor() {     this.REQ_METHODS = ["WS"];   }    requestItem(item) {     // ...   } } const inventoryTracker = new InventoryTracker(   ["apples", "bananas"],   new InventoryRequesterV2() ); inventoryTracker.requestItems();

到此,相信大家对“JS设计模式的六大原则是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: JS设计模式的六大原则是什么

本文链接: https://www.lsjlt.com/news/85015.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS设计模式的六大原则是什么
    本篇内容主要讲解“JS设计模式的六大原则是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS设计模式的六大原则是什么”吧!单一职责原则(SRP)单一功能原则...
    99+
    2024-04-02
  • Java设计模式六大原则是什么
    这篇文章主要讲解了“Java设计模式六大原则是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java设计模式六大原则是什么”吧!单一职责原则单一职责定义一个类只负责一个功能领域中的相应职...
    99+
    2023-06-02
  • Android设计模式SOLID六大原则是什么
    本篇内容主要讲解“Android设计模式SOLID六大原则是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android设计模式SOLID六大原则是什么”吧!单一职责原则定义定义:确保单例类...
    99+
    2023-06-25
  • java设计模式之六大原则分别是什么
    这篇文章将为大家详细讲解有关java设计模式之六大原则分别是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统...
    99+
    2023-06-15
  • JAVA初探设计模式的六大原则
    目录前言P1.单一职责原则(Single Responsibility Principle)P2.里氏替换原则(liskov substitution principle)P3.依赖...
    99+
    2024-04-02
  • 详解java设计模式之六大原则
    目录一、单一职责原则1、单一职责定义2、单一职责优点3、案例说明4、自己理解二、里氏代换原则1、定义2、案例说明3、自己理解三、接口隔离原则1、定义2、案例说明3、自己理解四、依赖倒...
    99+
    2024-04-02
  • 六大设计原则之开闭原则
    定义: 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 问题由来: 在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也...
    99+
    2024-04-02
  • Java面向对象设计的六大原则是什么
    本文小编为大家详细介绍“Java面向对象设计的六大原则是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java面向对象设计的六大原则是什么”文章能帮助大家解决疑惑,下面跟...
    99+
    2024-04-02
  • PHP常用六大设计模式是什么
    本文小编为大家详细介绍“PHP常用六大设计模式是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP常用六大设计模式是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单例模式特点:三私一公:私有的静态变量...
    99+
    2023-06-30
  • Android实例代码理解设计模式SOLID六大原则
    目录单一职责原则定义代码解释未遵守单一原则遵守单一原则开闭原则定义代码解释里氏替换原则定义代码解释依赖倒置原则定义代码解释未遵守依赖导致原则遵守依赖导致原则接口隔离原则定义代码解释未...
    99+
    2024-04-02
  • 解析Java实现设计模式六大原则之里氏替换原则
    目录一、什么是里氏替换原则1.1、里氏替换原则定义1.2、里氏替换原则有至少有两种含义二、使用里氏替换原则的目的三、里氏替换原则与继承多态之间的关系四、里式替换的规则4.1、子类方法...
    99+
    2024-04-02
  • java设计模式--七大原则详解
    目录设计模式单一职责原则接口隔离原则依赖倒转原则里氏替换原则开闭原则迪米特法则合成复用原则总结设计模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、...
    99+
    2024-04-02
  • layout布局的六大原则是什么
    layout布局的六大原则是:1. 对齐(Alignment):元素在布局中应该被正确地对齐,使得整体看起来更加整齐和统一。2. 平...
    99+
    2023-10-11
    layout
  • 浅谈Java设计模式之七大设计原则
    目录前言一、单一职责原则(SingleResponsibilityPrinciple,SRP)二、开闭原则(Open-ClosedPrinciple,OCP)三、里氏代换原则(Lis...
    99+
    2024-04-02
  • Python七大原则,24种设计模式
    七大原则,24种设计模式 七大设计原则: 1、单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:一个类负责一项职责. 2、里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】...
    99+
    2023-01-31
    原则 模式 Python
  • Java设计模式的里氏置换原则是什么
    这篇文章主要讲解了“Java设计模式的里氏置换原则是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java设计模式的里氏置换原则是什么”吧!里氏置换原则(Liskov Substitut...
    99+
    2023-06-17
  • C#实现六大设计原则之单一职责原则
    单一职责(SRP)定义: 不要存在多于一个导致类变更的原因,通俗的说,即一个类只负责一项职责。  问题由来: 类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求...
    99+
    2024-04-02
  • C#实现六大设计原则之依赖倒置原则
    依赖倒置原则(DIP)定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 问题由来: 类A直接依赖类B,假如要将类A改为依赖类C,则必须...
    99+
    2024-04-02
  • C#实现六大设计原则之里氏替换原则
    定义: 1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,...
    99+
    2024-04-02
  • C#实现六大设计原则之接口隔离原则
    接口隔离原则(ISP)定义: 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 问题由来: 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作