作者 | Jeskson来源 | 达达前端小酒馆

1

主要学习JavaScript中的六大原则。那么六大原则还记得是什么了吗?六大原则指:单一职责原则(SRP),开放封闭原则(OCP),里氏替换原则(LSP),依赖倒置原则(DIP),接口分离原则(ISP),最少知识原则(LKP)。

单一职责原则开放封闭原则里氏替换原则依赖倒置原则接口分离原则最少知识原则

那么什么是单一职责原则呢?单一职责原则,英文单词为:single responsable princple,原则体现为,一个对象或者是方法只做一件事。

从前车马很慢,书信很远,一生只够爱一个人。“从前的日色变得慢,车,马,邮件都慢,一生只够爱一个人 从前的锁也好看,钥匙精美有样子,你锁了,人家就懂了”(一个对象或者是方法只做一件事情)

如果一个方法承担了很多很多的职责,那么它在需求发生变化的过程中,需要改写这个方法的可能性就很大。

单一职责原则,一个类只提供一种功能,不要存在过多导致类变化的原因。从前,一个人负责两个不同的任务,为任务1,任务2,当任务1需要做调整时,而需要这个人做修整时,有可能会影响任务2的正常运行,会导致任务2没有办法完成。

遵循单一职责原则,就可以解决这种情况的发生,分别让两个人分别做任务1,任务2,让人1做任务1,让人2做任务2,这样,当需要改变任务1时,不会影响到任务2的正常运行,同理,任务2需要做修改时,人1做的事也不会发生影响。

里氏替换原则:所有引用基类的地方必须能够使用其子类的对象,从前有一个游戏玩家A,它有一个招式Z1,现在把这个招式Z1进行扩展,扩展后成为大招Z,其大招Z由原来的招式Z1和新功能Z2组成,新功能Z又由游戏玩家A的子类徒弟游戏玩家B去完成,那么这个子类徒弟游戏玩家B在完成这个新功能Z2的同时,有可能会影响到原来的招式Z1,而导致招式发生错误。

(迪米特法则:只与直接的朋友通信),每个对象都会和其他对象有耦合的关系,只要两个对象之间有耦合关系,就说这两个对象之间是朋友关系。

2

开放封闭原则,类,方法等应当对其扩展开放,对其修改封闭,在不修改的前提下进行扩展,扩展开发,当有新的需求出现的时候,我们可以对其进行扩展现有的方法,对象等已到达目的;修改关闭,不能对实体进行任何的修改。

不修改现有的功能方法,就可以进行实现各种变化的代码。

// 定义一个方法
function da(x, y) {
document.getElementById(x).style.color = y;
} // 调用方法da
da('dashucoding', 'red');
// 开发封闭原则 -> 错误
// 定义方法
function da(x, y, z) {
document.getElementById(x).style.color = y;
document.getElementById(x).style.size = z;
} // 调用方法da
da('dashucoding', 'red', '100px');
// 定义一个方法
function da(x, y) {
document.getElementById(x).style.color = y;
} // 不去动da这个方法
function dada(x, y, z) {
da(x,y);
document.getElementById(x).style.size = z;
} // 正确使用开发封闭原则 function da(x, y) {
document.getElementById(x).style.color = y;
} da('dashucoding', 'red'); function dada(x, y, z) {
da(x,y);
document.getElementById(x).style.size = z;
} dada('dashucoding', 'red', '100px');

单一职责原则,简介,就一个类而言,应该仅有一个引起它变化的原因。

开放封闭原则,简介,软件实体对扩展是开放的,但对修改是关闭的。即在不修改一个软件实体的基础上去扩展其功能。

里氏替换原则,简介,子类必须能够替换它们的基类。

依赖倒置原则,简介,高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。作用,降低了客户与实现模块间的耦合。

接口分离原则,简介,使用多个专门的接口来取代一个统一的接口。

合成复用原则,简介,就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。简单来说就是,要尽量使用组合,尽量不要使用继承。

迪米特法则,简介,又叫做最少知识原则,就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

3

里氏替换原则,就是对开发封闭原则进行补充,讲的是基类和子类的关系。理解里氏替换原则的最经典的例子是“正方形是长方形”,“鸵鸟不是鸟”等,拿正方形来说,上数学课的时候,我们就知道,正方形是长方形,它是一个长宽相等的长方形,那么由此可以看出,应该让正方形继承自长方形。

public class Rectangle {
private int height;
private int width; // 省略getter setter
} // 正方形长和宽始终一样 覆写
public class Square extends Rectangle {
@Override
public void setWidth(int width) {
super.setWidth(width);
super.setHeight(width);
} @Override
public void setHeight(int height) {
super.setWidth(height);
super.setHeight(height);
}
}
public class Test {
public static void main(String[] args) {
Test test = new Test();
Rectangle rectangle = new Rectangle();
rectangle.setHeight(5);
rectangle.setWidth(4);
test.zoom(rectangle, 2, 3); Square square = new Square();
square.setHeight(5);
square.setWidth(4);
test.zoom(square, 2, 3);
} public void zoom(Rectangle rectangle, int width, int height) {
rectangle.setWidth(rectangle.getWidth() width);
rectangle.setHeight(rectangle.getHeight() height);
}
}

依赖倒置原则,高层次的模块不应该依赖于低层次的模块,它们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

高层次模块依赖方向中层次模块,中层次模块依赖于低层次模块。高层次与低层次不相互依赖,低层次的任何修改都会影响高层次的模块。抽象层,高级层次,实现层次,具体实现依赖抽象层。

接口分离原则,客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。怎么说呢?

有三个客户端A,B,C都依赖于一个大的接口,这个大的接口有A(),B(),C(),但是客户端A只需要A()而已,其他不需要,这个时候就利用接口分离原则让客户端A只需要A(),让客户端B只需要B(),让客户端C只需要C()。

设计原则是指导思想,从思想上给我们指明程序设计的正确方向,设计模式是实现的手段,因此设计模式也是遵守这些原则的。达到高内聚低耦合,高内聚就是说模块内部要高度聚合,是模块内部的关系,低耦合是说模块与模块之间的耦合度要尽量低,是模块与模块之间的关系。

单一职责原则总结:一个对象只做一件事。

开放封闭原则总结:对扩展开放,对修改封闭。

迪米特法则,又叫做最少知识原则总结:一个对象应该对其他对象有最少的了解。

设计模式中的外观模式和中介模式,是迪米特法则应用的例子。

迪米特法简单就是,只与朋友说话,不与陌生人说话。缺点就是系统中会产生大量的小方法。

合成复用原则,多用组合,少用继承。继承是面向对象的三大特征,封装,继承,多态,继承实现简单,易于扩展,但是继承也是由缺陷的,父类变,子类必须变,继承破坏了封装,对父类来说,它的实现对子类来说是透明的,继承是一种强耦合的关系。

父类变,子类必须变;继承破坏了封装(子类是封装的,因父类的改变,导致父类破坏了子类的封装),对于子类来说,通过继承父类,是没有安全保障的,父类修改其内容,就会导致子类的功能被破坏;对于父类来说,子类继承父类,重写它的方法时,父类的方法是不可以任意修改的。

设计原则:

单一职责原则,一个方法只做一件事情;里氏替换原则,子类可以代替父类;依赖倒置原则,只依赖接口不依赖方法,不关心底层的实现方法;接口分离原则,把大的接口拆分成小的接口;迪米特法则,函数中传入的参数越少越好,开放封闭原则,面向扩展开放,面向修改关闭。

5

单一职责原则,优点:降低了单个类或者是对象的复杂程度,按照单一职责原则把对象分解成更小的单位,有利于代码的复用,也有利于进行单元测试,当一个职责需要改变的时候,不会影响到其他的职责。缺点:增加了编码的复杂程度,同时增加了对象之间的关联难度。

理解为不同类具备不同的职责。一个类只承担一个职责。

最少知识原则,优点:减少或消除对象之间耦合程度,提高复用性。缺点:需要封装对象或者是引入一个第三方对象来处理两者之间的关系,有时候第三方对象会很复杂,复杂到难以维护。

开放封闭原则,优点:程序的稳定性很高,容易变更的地方分离后更加容易维护。

// 单一职责原则
// 类
public class People {
public void work() {
System.out.println("work");
}
public void eat() {
System.out.println("eat");
}
public void play() {
System.out.println("play");
}
}
// 一个类, 三个职责
// 单一职责原则
public interface workInter {
public void work();
}
public interface eatInter {
public void eat();
}
public interface playInter {
public void play();
}
// 继承接口
public class People implements workInter, eatInter, playInter {
public void work() {
System.out.println("work");
}
public void eat() {
System.out.println("eat");
}
public void play() {
System.out.println("play");
}
}
public class Test {
public static void main(String args[]) {
People people = new People();
workInter worker = new People();
worker.work(); eatInter eater = new People();
eater.eat(); playInter player = new People();
player.play();
}
}

里氏替换原则,所有引用基类的地方必须能透明地使用其子类的对象,子类必须完全实现父类的功能,凡是父类出现的地方,替换成子类也不会有问题。

里氏替换原则,我喜欢动物,那我一定喜欢狗,因狗是动物的子类;但是我说我喜欢狗,不能说我喜欢动物,因为我不喜欢其他小小小型动物。

子类必须完全实现父类的功能,举例没有实现的:

// 父类
public abstract class Father {
// work
public abstract void work();
}
// 子类
public class Child extends Father {
@Override
public void work() {
// 实现了这个方法,但功能不实现,什么都不做
}
}

依赖倒置原则,理解为使用接口或者是抽象类。模块之间的依赖是通过抽象发生的,实现类之间不能直接的依赖的关系,实现类的依赖关系是通过接口或者抽象类产生的,接口或者抽象类依赖于实现类,实现类要依赖于接口或者是抽象类。

public class Da {
private Dada dada = null;
public Da(Dada dada) {
this.da = da;
}
} public interface DaInter {
public void setDa(Dada dada);
} public class Da implements DaInter {
private Dada dada = null;
public void setDA(Dada dada) {
this.da = da;
}
}

接口分离原则,如果一个类实现一个接口,但是这个接口有它不要的方法,就需要把这个接口拆分,把它需要的方法独立出来形成一个新的接口给这个类去实现。

单例模式:一个类只有一个实例,用一个变量去区别当前实例是否创建过

// 一个参数,一个变量
var da = function (name) {
this.name = name;
this.instance = null;
}
da.prototype.getName = function() {
alert(this.name)
}
da.getInstance = fucntion(name) {
if(!this.instance) {
this.instance = da(name);
}
return this.instance;
}

推荐阅读

1、你知道多少this,new,bind,call,apply?那我告诉你

2、为什么学习JavaScript设计模式,因为它是核心

3、一篇文章把你带入到JavaScript中的闭包与高级函数

4、大厂HR面试ES6中的深入浅出面试题知识点

5、一篇JavaScript技术栈带你了解继承和原型链

关于目前文章内容即涉及前端,PHP知识点,如果有兴趣即可关注,很荣幸,能被您发现,真是慧眼识英!也感谢您的关注,在未来的日子里,希望能够一直默默的支持我,我也会努力写出更多优秀的作品。我们一起成长,从零基础学编程,将 Web前端领域、数据结构与算法、网络原理等通俗易懂的呈现给小伙伴。分享 Web 前端相关的技术文章、工具资源、精选课程、热点资讯。

若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理。

请点赞!因为你们的赞同/鼓励是我写作的最大动力!

欢迎关注达达的CSDN!

这是一个有质量,有态度的博客

JavaScript设计模式经典-面向对象中六大原则的更多相关文章

  1. 10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则

    加载类可以使用include.require.require_once三种中的任意一种,每个关键字都有两种方法,但是这种方法的缺点是需要加载多少个php文件,就要写多少个加载类的方法.一般也就需要加载 ...

  2. JAVA面向对象-----java面向对象的六大原则

    现在编程的主流语言基本上都是面向对象的.如C#,C++,JAVA.我们在使用时,已经构造了一个个的类.但是往往由于我们在类内部或外部的设计上存在种 种问题,导致尽管是面向对象的语言,却是面向过程的逻辑 ...

  3. Java设计模式面试题 01 - 六大原则

    Java设计模式面试题 01 - 六大原则 1. 单一职责原则 Single Responsibility Principle SRP原则 分清职责,接口一定要做到单一职责,方法也要做到,类尽量做到 ...

  4. java设计模式(2)---六大原则

    设计模式之六大原则 这篇博客非常有意义,希望自己能够理解的基础上,在实际开发中融入这些思想,运用里面的精髓. 先列出六大原则:单一职责原则.里氏替换原则.接口隔离原则.依赖倒置原则.迪米特原则.开闭原 ...

  5. javaScript设计模式之面向对象编程(object-oriented programming,OOP)(二)

    接上一篇 面向对象编程的理解? 答:面向对象编程,就是将你的需求抽象成一个对象,然后针对这个对象分析其特征(属性)与动作(方法).这个对象我们称之为类.面向对象编程思想其中一个特点就是封装,就是把你需 ...

  6. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

  7. 理解JavaScript设计模式与开发应用中发布-订阅模式的最终版代码

    最近拜读了曾探所著的<JavaScript设计模式与开发应用>一书,在读到发布-订阅模式一章时,作者不仅给出了基本模式的通用版本的发布-订阅模式的代码,最后还做出了扩展,给该模式增加了离线 ...

  8. 0608pm单例模式and面向对象的六大原则

    //把类控制住,不让外界造她的对象class DA{ public $name; static private $dx;//存放对象的变量 //将构造变为私有,外界没法造对象 private func ...

  9. javascript设计模式学习之十七——程序设计原则与面向接口编程

    一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...

随机推荐

  1. ASP.NET Core MVC的Razor视图中,使用Html.Raw方法输出原生的html

    我们在ASP.NET Core MVC项目中,有一个Razor视图文件Index.cshtml,如下: @{ Layout = null; } <!DOCTYPE html> <ht ...

  2. C#读写设置修改调整UVC摄像头画面-倾斜

    有时,我们需要在C#代码中对摄像头的倾斜进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  3. Django---Django中使用COOKIE和SESSION

    Django---Django中使用COOKIE和SESSION 一丶Cookie cookie的由来 # HTTP协议是无状态的. # 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请 ...

  4. 使用MHA实现MySQL主从复制高可用

    一.MHA简介        MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司的youshimaton(现就职于Fac ...

  5. vue 封装公用函数

    Vue 函数封装 格式化浏览器时间 /** * 格式化时间 * @param params * @param blo 默认为true * @returns {string} * @constructo ...

  6. 网址URL分解

    http://www.joymood.cn:8080/test.php?user=admin&pwd=admin#login 1.location.href:得到整个如上的完整url 2.lo ...

  7. JavaScript 流程控制(二)循环结构

    一.while 语句 语法结构: 声明循环变量:while (循环条件) { //循环体 // 迭代条件 } 当循环条件为 true 时,执行循环体:当循环条件为false时,结束循环. 二.do.. ...

  8. 解决kettle在两个mysql之间迁移数据时乱码的问题 和 相关报错 及参数调整, 速度优化

    1. 乱码问题 编辑目标数据库的链接: 配置编码参数即可. 2. 报错 No operations allowed after statement closed. 需要调整wait_timeout:  ...

  9. Linux系统密码复杂度安全配置

    密码有效期控制 在文件/etc/login.defs中进行设置,如下参数 PASS_MAX_DAYS 180 #密码最长过期天数 PASS_MIN_DAYS 30 #密码最小过期天数 PASS_MIN ...

  10. win2003下安装python3.4 + pyspider

    昨天尝试了在win2003下安装python2.7.这个是文章地址:https://www.cnblogs.com/alpiny/p/11706606.html 但是程序跑了一晚上,发现有一点问题,是 ...