我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

本篇内容主要讲解“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设计模式的六大原则是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

Java设计模式六大原则是什么

这篇文章主要讲解了“Java设计模式六大原则是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java设计模式六大原则是什么”吧!1.单一职责原则单一职责定义一个类只负责一个功能领域中的相
2023-06-02

Android设计模式SOLID六大原则是什么

本篇内容主要讲解“Android设计模式SOLID六大原则是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android设计模式SOLID六大原则是什么”吧!单一职责原则定义定义:确保单例类
2023-06-25

java设计模式之六大原则分别是什么

这篇文章将为大家详细讲解有关java设计模式之六大原则分别是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统
2023-06-15

PHP常用六大设计模式是什么

本文小编为大家详细介绍“PHP常用六大设计模式是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP常用六大设计模式是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单例模式特点:三私一公:私有的静态变量
2023-06-30

layout布局的六大原则是什么

layout布局的六大原则是:1. 对齐(Alignment):元素在布局中应该被正确地对齐,使得整体看起来更加整齐和统一。2. 平衡(Balance):布局中的元素应该均匀地分布在页面上,避免过于集中或分散。3. 一致性(Consiste
2023-10-11

Java设计模式的里氏置换原则是什么

这篇文章主要讲解了“Java设计模式的里氏置换原则是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java设计模式的里氏置换原则是什么”吧!里氏置换原则(Liskov Substitut
2023-06-17

Python七大原则,24种设计模式

七大原则,24种设计模式七大设计原则: 1、单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】:一个类负责一项职责. 2、里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】:继承与派生的规
2023-01-31

python模块化设计原则是什么

Python模块化设计原则是一组指导原则,用于在开发Python程序时进行模块化设计。这些原则旨在提高代码的可维护性、可扩展性和可重用性。1. 单一职责原则(Single Responsibility Principle,SRP):一个模块
2023-09-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录