栗子

【设计模式】设计模式的分类及六大原则

情到浓时终转凉″ 提交于 2019-11-25 23:44:23
一、设计模式的分类 总体来说设计模式分为三大类:   创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。   结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。   行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。   其实还有两类:并发型模式和线程池模式。 二、 设计模式的 六大原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特原则 开闭原则 单一职责 概念:对功能进行分类,代码进行解耦 栗子:一个网络请求框架大致分为:请求类,缓存类,配置类;不能把这三个功能混合在一起,必须分成三个类分别去实现不同的功能 里氏替换 概念:在继承类时,除了扩展一些新的功能之外,尽量不要删除或者修改对父类方法的引用,也尽量不要重载父类的方法 栗子:每个类都是Object的子类,Object类中有一个toString()的方法,假如子类重写该方法并且返回null,这个子类的下一级继承返回的都是null,那么在不同开发人员维护时可能考虑不到这个问题,并且很可能会导致程序崩溃 依赖倒置 概念:高层模块不依赖低层次模块的细节,高层次就是不依赖细节而是依赖抽象(不依赖具体的类,而是依赖于接口) 栗子

JS三座大山再学习(二、作用域和闭包)

隐身守侯 提交于 2019-11-25 21:13:56
原文地址 作用域 JS中有两种作用域:全局作用域|局部作用域 栗子1 console.log(name); //undefined var name = '波妞'; var like = '宗介' console.log(name); //波妞 function fun(){ console.log(name); //波妞 console.log(eat) //ReferenceError: eat is not defined (function(){ console.log(like) //宗介 var eat = '肉' })() } fun(); name定义在全局,在全局可以访问到,所以 (2) 打印能够正确打印; 在函数fun中,如果没有定义name属性,那么会到它的父作用域去找,所以 (3) 也能正确打印。 内部环境可以通过作用域链访问所有外部环境,但外部环境不能访问内部环境的任何变量和函数。类似 单向透明 ,这就是作用域链,所以 (4) 不行而 (5) 可以。 那么问题来了,为什么第一个打印是"undefined",而不是"ReferenceError: name is not defined"。原理简单的说就是JS的 变量提升 变量提升: JS在解析代码时,会将所有的声明提前到所在作用域的最前面 栗子2 console.log(name); //undefined