@GivenCui
2016-06-01T06:44:36.000000Z
字数 4234
阅读 784
js高级
- 设计模式是一套反复使用, 代码设计经验的总结.使用设计模式是为了能够更好的理解代码,更好的重用代码.
- 设计模式不是JS独有的, 我们常用的23种设计模式, 针对的是大部分面向对象语言.
想实现某个功能,自己不去实现,我委托"别人"帮我实现.
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title></title><script type = "text/javascript"></script></head><body></body></html>
单例设计模式
通过构造函数,无论创造多少次,只能创造出来唯一的一个实例对象.
单例设计模式的应用场景:
1. 节约性能
2. 数据共享
3. window就是单例对象单线程就可以用this第二次以后保持不变;JS就是单线程的.
多线程的话可能没办法确定谁是第一次,上"锁"解决.
查资料!
!!!!!!!!!!
声明和调用一起写的方法
应用作为匿名空间
应用在闭包情况下的立即调用
在单例模式时用来第一次创建之后就"锁住"
(function () {console.log("测试,是否立即调用??");})();
var fn = (function () {console.log("另一种写法");})();
定义一些算法或逻辑, 把它们封装起来, 根据情况去分别调用这些算法和逻辑;
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>策略设计模式</title></head><body><script type="text/javascript">// 创建一个策略对象, 方便管理相应的算法// 类似switch的逻辑,可以代替switch来设计更高级的功能!!var strategies = {a : function (salary) { // a策略return salary*2;},b : function (salary) { // b策略return salary*3;},c : function (salary) { // c策略return salary*4;}};//var getMoney = function (level,salary) {// 用[]去匹配return strategies[level](salary); // []可以调用形参属性,同时属性又是一个方法};var x = getMoney("b", 20000);console.log(x);</script></body></html>
解决两个软件或者两个程序数据接口不兼容的问题
举例: 生活中的笔记本的电源适配器
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>适配器设计模式</title><script type = "text/javascript"></script></head><body></body></html>
设计一个函数,用来接收参数,并根据不同的参数返回同一个接口的不同实例.
工厂设计模式的优缺点:
1. 优点: 解决了创建多个相似对象的问题
2. 缺点: 没有解决对对象的识别问题(没有明确的对象的类型).思想的应用
1. 把工厂作为一个工具类去封装方法.
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>工厂设计模式</title><script type = "text/javascript"></script></head><body></body></html>
利用继承的思想实现模板设计模式,JS中的继承是利用prototype来实现.
两部分组成
1.抽离出来的父类(父级)对象
2.具体的子类(子级)对象
注: JS中没有类的继承,只有对象的继承.换句话说,某个类型只能继承于某个类型的一个实例对象.
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>模板设计模式</title></head><body><script type="text/javascript">// 模板设计模式,利用继承// JS的继承用prototype来实现/** 咖啡* 1. 烧水* 2. 冲咖啡* 3. 把咖啡倒入杯子* 4. 加糖和奶**/// coffee构造函数// console.group("喝咖啡流程");// var Coffee = function () {// };// // 烧水方法// Coffee.prototype.boilWater = function () {// console.log ("烧水");// };// // 冲咖啡// Coffee.prototype.brewCoffee = function () {// console.log("冲咖啡");// };// // 把咖啡倒入杯子// Coffee.prototype.pourInCup = function () {// console.log("把咖啡倒入杯子");// };// // 加糖/盐// Coffee.prototype.addSugarAndMilk = function () {// console.log("加糖和奶");// };// /*********封装一下咖啡的流程**********/// Coffee.prototype.init = function () {// this.boilWater();// this.brewCoffee();// this.pourInCup();// this.addSugarAndMilk();// };// // 创建一个咖啡对象// var coffee = new Coffee();// coffee.init();// console.groupEnd();// console.group("喝茶流程");// /*// * 茶// */// // 喝茶的构造函数// var Tea = function () {// };// // 1.烧水// Tea.prototype.boilWater = function () {// console.log("烧水");// };// // 2.沏茶// Tea.prototype.brewTea = function () {// console.log("沏茶");// };// // 3.把茶放到杯子中// Tea.prototype.pourInCup = function () {// console.log("把茶放到杯子中");// };// // 4.加柠檬// Tea.prototype.addLemon = function () {// console.log("加柠檬");// };// // 封装喝茶流程// Tea.prototype.init = function () {// this.boilWater();// this.brewTea();// this.pourInCup();// this.addLemon();// };// // 创造茶的实例// var tea = new Tea();// tea.init();// console.groupEnd();/******发现有共同点,提出一个父类*****/console.group("用模板设计模式优化");// 共同的部分抽象到一个父类里,子类继承父类即可// JS中没有类的继承,只有对象的继承.换句话说,某个类型只能继承于某个类型的一个实例对象.// 咖啡和茶共有方法抽象// 1.boilwater() 2. brew() 3. pourInCup() 4. add()// 放到父类里var Drink = function () {};Drink.prototype.boilwater = function () {console.log("烧水");};// 空是为了子类去具体实现Drink.prototype.brew = function () {};Drink.prototype.pourInCup = function () {console.log("倒入杯中");};// 空是为了子类去具体实现Drink.prototype.add = function () {};// 父类流程的实现Drink.prototype.init = function () {this.boilwater();this.brew();this.pourInCup();this.add();};/********下面是子类**************/console.log("*****喝茶*****");// 咖啡var Coffee = function () {};Coffee.prototype = new Drink();Coffee.prototype.constructor = Coffee;Coffee.prototype.brew = function() {console.log("冲咖啡");};Coffee.prototype.add = function() {console.log("咖啡中加糖");};var coffee = new Coffee();coffee.init();console.log("*****喝茶*****");// 茶var Tea = function () {};Tea.prototype = new Drink();Tea.prototype.constructor = Tea;Tea.prototype.brew = function() {console.log("冲茶");};Tea.prototype.add = function() {console.log("茶中加柠檬");};var tea = new Tea();tea.init();console.groupEnd();</script></body></html>