Addy Osmani解密:JavaScript基本设计模式实战指南
需积分: 5 98 浏览量
更新于2024-10-29
收藏 945KB ZIP 举报
资源摘要信息: "Addy Osmani 的基本 JS 设计模式的演示和注释"
知识点:
JavaScript设计模式是面向对象设计模式在JavaScript编程语言中的应用。设计模式是被广泛认可的解决特定问题的最佳实践,它们是软件工程中经过时间考验的经验总结。Addy Osmani,一名资深前端工程师,同时也是Google的开发者倡导者,他在《JavaScript设计模式》一书中详细介绍了多种适用于JavaScript的设计模式。下面将介绍一些基本的JavaScript设计模式,以及它们在Addy Osmani的《JavaScript设计模式》一书中的体现。
1. 单例模式(Singleton Pattern)
单例模式确保一个类只有一个实例,并提供一个全局访问点。在JavaScript中,由于其函数作用域的特性,实现单例模式相对简单。例如,使用立即执行函数表达式(IIFE)来创建一个模块,该模块暴露一个唯一的实例。
```javascript
const SingletonModule = (function() {
// 私有变量
let instance;
function createInstance() {
// 创建对象
const object = new Object("I am an instance");
return object;
}
return {
getInstance: function() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
// 使用模块
const instance1 = SingletonModule.getInstance();
const instance2 = SingletonModule.getInstance();
console.log(instance1 === instance2); // true
```
2. 工厂模式(Factory Pattern)
工厂模式用于创建对象,而不必指定将要创建的对象的具体类。工厂模式的好处是能够在运行时决定创建对象的类型,这种决策可以基于传递给工厂的参数。工厂模式可以用来封装创建对象的复杂性,使得创建对象的过程对调用者透明。
```javascript
function createPerson(name, age) {
if (age > 18) {
return new Adult(name, age);
} else {
return new Child(name, age);
}
}
const person1 = createPerson("Alice", 25);
const person2 = createPerson("Bob", 15);
```
3. 观察者模式(Observer Pattern)
观察者模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。在JavaScript中,事件驱动编程的基础就是观察者模式。
```javascript
const EventManager = (function() {
const events = {};
return {
subscribe: function(event, callback) {
if (!events[event]) {
events[event] = [];
}
events[event].push(callback);
},
publish: function(event, data) {
if (events[event]) {
events[event].forEach(callback => {
callback(data);
});
}
}
};
})();
// 使用观察者模式
EventManager.subscribe('example', (data) => {
console.log(`Received event: ${data}`);
});
EventManager.publish('example', 'Hello, World!');
```
4. 命令模式(Command Pattern)
命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许你使用不同的请求、队列或者日志请求来参数化其他对象。而且,请求者(invoker)和处理者(receiver)可以被解耦,允许运行时指定请求的处理者。
```javascript
class Command {
constructor(receiver) {
this.receiver = receiver;
}
execute() {
throw new Error("This method must be implemented!");
}
}
class ConcreteCommand extends Command {
execute() {
this.receiver.action();
}
}
class Receiver {
action() {
console.log('Action performed');
}
}
class Invoker {
constructor() {
***mands = [];
}
setCommand(command) {
***mands.push(command);
}
executeCommands() {
***mands.forEach(command => {
command.execute();
});
}
}
// 使用命令模式
const receiver = new Receiver();
const command = new ConcreteCommand(receiver);
const invoker = new Invoker();
invoker.setCommand(command);
invoker.executeCommands();
```
以上仅为Addy Osmani在《JavaScript设计模式》中介绍的几种设计模式的简要概述。通过深入学习和实践这些模式,开发人员能够编写出更灵活、可维护和可复用的JavaScript代码。此外,理解这些模式能帮助开发人员在阅读其他人的代码时,更好地理解其架构和设计意图。
241 浏览量
2021-05-21 上传
2021-04-29 上传
2021-05-05 上传
2021-05-19 上传
2021-08-03 上传
2021-04-28 上传
2021-06-07 上传
2021-06-20 上传
cocoaitea
- 粉丝: 20
- 资源: 4566
最新资源
- PL2302驱动.rar
- jotto-testing-project:为使用React构建的简单猜字游戏项目编写测试
- BASS 音频输出设备自动切换-易语言
- coding-notes
- foobarx.github.io
- C# Base64编码和解码 带源码.rar
- LiveTags in every eMail-crx插件
- 自动化码头内集卡作业调度优化.rar
- UITextViewExtras(iPhone源代码)
- JLINKV9.4 PCB-自动升级固件-教程.rar
- 博克
- blogwithaddexperience
- Stocks Market-crx插件
- jsp+mysql图书馆管理系统
- EXDUI2.0日期框扩展,支持时分秒-易语言
- saybeking.github.io