@GivenCui
2016-06-01T14:44:36.000000Z
字数 4234
阅读 663
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>