设计模式(Design Pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案
原则:找出程序中变化的地方,并将变化封装起来
目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性
设计模式的定义
设计模式(Design Pattern) 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案
原则:找出程序中变化的地方,并将变化封装起来
目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性
分辨模式的关键是意图而不是结构
编程语言按照数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言。
多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来,也就是将“不变的事物”与 “可能改变的事物”分离开来
封装的目的是将信息隐藏,不仅指隐藏数据,还包括隐藏实现细节、设计细节以及隐藏对象的类型
js依赖变量的作用域来实现封装特性,而且只能模拟出 public 和 private 这两种封装性
在 ECAMScript 6中,还可以通过 Symbol创建私有属性
这 23种设计模式分别被划分为创建型模式、结构型模式和行为型模式。
创建型模式来说,要创建一个对象,是一种抽象行为,而具体创建什么对象则是可以变化的,创建型模式的目的就是封装创建对象的变化。而结构型模式封装的是对象之间的组合关系。行为型模式封装的是对象的行为变化。
JavaScript本身是一门基于原型的面向对象语言,它的对象系统就是使用原型模式来搭建的
当对象无法响应某个请求时,会把该请求委托给它自己的原型。
原型编程范型至少包括以下基本规则
- 所有的数据都是对象。
- 要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它。
- 对象会记住它的原型。
- 如果对象无法响应某个请求,它会把这个请求委托给它自己的原型
单例模式
在传统开发过程中,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。
字面量对象就是一种最简单的单例实现
构造函数
js中 构造函数通过 new 操作符创建特定类型的对象1
2
3
4
5
6
7
8
9
10
11
12
13
14function Person(name, age) {
this.name = name;
this.age = age;
}
//通过prototype让每一个实例共享say方法,这样免去每次实例对象时创建say方法
Person.prototype.say= function () {
return this.name + "活了" + this.age + "年。";
};
var lon = new Person("lon", 23);
var you = new Person("you", 18);
console.log(lon.say());
console.log(you.say());
可以通过 var x = new String(“youlon”) 来理解
因为每个字符串都有toString等方法。
工厂模式
工厂模式定义一个用于创建对象的接口 这个接口由子类决定实例化哪一个类。
网页面里插入一些元素:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38var page = page || {};
page.dom = page.dom || {};
//子函数1:处理文本
page.dom.Text = function () {
this.insert = function (where) {
var txt = document.createTextNode(this.url);
where.appendChild(txt);
};
};
//子函数2:处理链接
page.dom.Link = function () {
this.insert = function (where) {
var link = document.createElement('a');
link.href = this.url;
link.appendChild(document.createTextNode(this.url));
where.appendChild(link);
};
};
//子函数3:处理图片
page.dom.Image = function () {
this.insert = function (where) {
var im = document.createElement('img');
im.src = this.url;
where.appendChild(im);
};
};
//定义工厂处理函:
page.dom.factory = function (type) {
return new page.dom[type];
}
//使用方式如下:
var o = page.dom.factory('Link');
o.url = 'http://www.cnblogs.com';
o.insert(document.body);
原型模式
原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象。
js中真正的原型继承ES5标准提出的,使用Object.create方法来创建这样的对象1
2
3
4
5
6
7
8var plane = {
fly: function () { },
name: '343E'
};
// 使用Object.create()创建一架新飞机
var anotherCar = Object.create(plane);
anotherCar.name = '波音747';