设计模式是在面向对象软件设计开发中,针对特定问题的简洁而优雅的解决方案; ——-《设计模式:可复用面向对象软件的基础》
设计模式的前提知识:
1.面向对象编程的原型;
javascript由于动态语言,弱类型,而且没有类的概念,class也是基于原型的语法糖;
多态:同一操作对于不同的对象有着不一样的行为和结果。
2.多态和封装;
3.js的原型模式和基于原型的对象系统;
4.js中的指针,call和apply和bind;
5.闭包和高阶函数;
闭包的优缺点:1.使某个对象常驻内存;2.减少对全局对象的污染;3.作为一个私有变量使用; 缺点是:容易导致内存溢出;
什么是高阶函数:满足两点中的一点:1、将函数作为参数传递,2.返回值为一个函数; 函数currying:1.参数复用;2.提前确认;3.延迟执行;
常用的设计模式
1. 单例模式:
什么是单例模式:
单例模式是每个类只对应一个实例,提供一个全局访问的入口;最常用的:惰性单例模式
function getSingle(fn){var result;return function(){return result || (result = fn.apply(this,arguments))}}
2. 策略模式:
什么是策略模式:定义一些列的算法,把他们封装起来,然后可以互相替换;
优点:利用组合和委托和多态等技术,可以有效的避免多重条件选择语句;完美实现了开放-封闭原则,将算法封装在独立的类中;
缺点:创建许多的算法类;
3. 代理模式
通过代理来决定是否可以访问主体;
保护代理:有权拒绝访问;
虚拟代理:在合适的时机访问主体;
4. 发布订阅模式(观察者模式)
通过订阅事件,在发布事件的时候可以执行订阅事件的回调函数,来达到对象之间的解耦;
- 命令模式
- 组合模式
7.Template 模式(模板方法模式)
其实是利用了抽象类和抽象方法,在创建子类时必须要实现抽象类和方法;
优点:模板方法通过继承的方式实现封装变化提高扩展性;它也满足开放-封闭原则;
8. 享元模式
减少类的数量,重用可用的类,用于减小内存占用,是一种性能优化的设计模式;
9. 职责链模式
使多个对象都有机会处理请求,对象形成了一条链,请求沿着链向下传递,知道某个对象处理请求;
10. 中介者模式
通过中介者模式,可以松散对象之间的耦合,对象通过与中介者联系,通过中介者发布事件,由原来的多对多联系改为一对多的关系;
缺点:对象之间的耦合性降低,交互逻辑都放了中介对象中,必然造成中介对象难以维护;
中介者模式是迎合最少知识原则的一种设计模式;对象尽量不接触其他对象;
11. 装饰者模式
实现AOP(面向切面编程)的一种设计模式;
AOP(面向切面编程):将一些公用的非业务类型的功能代码抽离出来,比如日志,错误校验,通过动态织入的方式,不侵入源代码的方式增加新的功能;
装饰器:装饰器可以装饰类,方法,参数
- 状态模式
什么是状态模式:状态模式的关键是区分事物内部的状态,状态的改变会导致行为的改变;
设计模式的原则
- 单一职责原则
尽量保证对象实现的功能单一,这能减小对象之前的耦合;实现的模式:策略模式、发布订阅模式;
优缺点:
优点是降低对象实现的复杂度,按照职责将对象拆分成细粒度的模块,这有助于代码的复用和单元测试;
缺点就是,对象实现的复杂度降低了,但是对象之间的耦合度确增高了,针对不同的应用环境,如何把握恰当的单一职责而且提高模块内部的额高内聚,达到平衡;
- 最少知识原则
将对象之间的联系限制在最小的范围内,最少的接触其它对象,实现的模式典型的有:中介者模式;
- 开放-封闭原则
开放-封闭原则的核心是:软件设计中,软件实体(类,模块,函数)应该是可以扩展的,但是不可修改;
开放-封闭原则,在不改变源码的基础上,对对象实现封装;实现模式有:发布订阅模式、职责链模式、策略模式、代理模式、模板方法模式(封装变化);
优缺点:有点是减少对象之间的耦合,再不通过修改源码的基础上,实现包装和功能织入;
面向接口编程:
(typescript)面向接口编程语言层面的支持:
TS提供了class抽象类的实现和interface;
- 抽象类和接口之间的相同点:
抽象类和接口都对变化做了封装
- 抽象类和接口的不同点:
不同是,抽象类只能继承一个,而接口可以实现(继承)多个;抽象类中提供了一些具体的实现和逻辑的方法,规定了子类中的行为,抽象方法需要子类重实现不同的功能;接口中定义了属性或方法的类型,是更为抽象的封装,只关注行为方面的抽闲,不关心具体的实现;
