学习关于JavaScript常用的8大设计模式
JavaScript 常用的8大设计模式有
- 工厂模式:工厂模式是一种创建对象的模式,可以通过一个共同的接口创建不同类型的对象,隐藏了对象的创建过程。
- 单例模式:单例模式是一种只允许实例化一次的对象模式,可以通过一个全局访问点来访问它。
- 建造者模式:建造者模式是一种创建复杂对象的模式,通过将对象的构建过程分解为多个步骤,逐步构建对象。
- 适配器模式:适配器模式是一种将不兼容的接口转换为兼容接口的模式,通过适配器可以使得不同的对象能够相互协作。
- 观察者模式:观察者模式是一种定义一对多的依赖关系,当一个对象发生改变时,所有依赖于它的对象都会得到通知并自动更新的模式。
- 装饰者模式:装饰者模式是一种在不改变对象自身的基础上,动态地扩展对象的功能的模式,通过装饰器可以给对象添加新的功能。
- 策略模式:策略模式是一种定义一系列算法,并将其封装在独立的策略类中,使得它们可以相互替换的模式,通过策略模式可以动态改变对象的行为。
- 命令模式:命令模式是一种将请求封装成对象,从而使得请求可以被保存、传递、取消、排队或记录的模式,通过命令模式可以将发出请求的对象和执行请求的对象解耦。
JavaScript 设计模式的示例代码:
- 工厂模式:
// 定义一个工厂函数
function createPerson(name, age) {
const person = {};
person.name = name;
person.age = age;
person.sayName = function() {
console.log(this.name);
};
return person;
}
// 使用工厂函数创建对象
const person1 = createPerson('Alice', 20);
const person2 = createPerson('Bob', 30);
person1.sayName(); // Alice
person2.sayName(); // Bob
- 单例模式:
// 定义一个单例对象
const logger = {
log: function(message) {
console.log(message);
}
};
// 使用单例对象记录日志
logger.log('This is a log message.');
3.建造者模式:
// 定义一个建造者类
class PersonBuilder {
constructor() {
this.person = {};
}
setName(name) {
this.person.name = name;
return this;
}
setAge(age) {
this.person.age = age;
return this;
}
build() {
return this.person;
}
}
// 使用建造者创建对象
const personBuilder = new PersonBuilder();
const person = personBuilder.setName('Alice').setAge(20).build();
console.log(person); // { name: 'Alice', age: 20 }
- 适配器模式:
// 定义一个不兼容的接口
class IncompatibleApi {
fetchData() {
console.log('Fetching data from the incompatible API.');
}
}
// 定义一个适配器类,将不兼容的接口转换为兼容接口
class Adapter {
constructor(incompatibleApi) {
this.incompatibleApi = incompatibleApi;
}
fetch() {
this.incompatibleApi.fetchData();
}
}
// 使用适配器调用兼容接口
const incompatibleApi = new IncompatibleApi();
const adapter = new Adapter(incompatibleApi);
adapter.fetch(); // Fetching data from the incompatible API.
- 观察者模式:
// 定义一个主题对象
class Subject {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
removeObserver(observer) {
const index = this.observers.indexOf(observer);
if (index !== -1) {
this.observers.splice(index, 1);
}
}
notify(data) {
this.observers.forEach(observer => {
observer.update(data);
});
}
}
// 定义一个观察者对象
class Observer {
constructor(name) {
this.name = name;
}
update(data) {
console.log(`${this.name} received data: ${data}`);
}
}
// 使用主题对象通知观察者对象
const subject = new Subject();
const observer1 = new Observer('Alice');
const observer2 = new Observer('Bob');
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notify('Hello world!'); // Alice received data: Hello world! Bob received data: Hello world!
- 装饰者模式:
// 定义一个被装饰的对象
class Component {
operation() {
console.log('Component)
}
}
// 定义一个装饰器类,增强被装饰的对象
class Decorator {
constructor(component) {
this.component = component;
}
operation() {
this.component.operation();
console.log('Decorator added new behavior.');
}
}
// 使用装饰器增强被装饰的对象
const component = new Component();
const decorator = new Decorator(component);
decorator.operation(); // Component, Decorator added new behavior.
- 命令模式
在命令模式中,有四个主要的角色:
- 命令(Command):封装了请求的所有信息,包括命令的接收者、具体的操作方法等。通常定义一个接口或抽象类,由具体命令类实现。
- 具体命令(Concrete Command):实现了命令接口或抽象类,并封装了接收者的操作方法。当接收者需要执行命令时,就调用具体命令的execute()方法。
- 调用者(Invoker):负责将命令对象传递给接收者,并在需要时调用命令的execute()方法。调用者不需要知道具体的命令,只需要知道如何调用命令对象。
- 接收者(Receiver):具体执行命令的对象。当命令对象的execute()方法被调用时,接收者就会执行相应的操作。
// 定义命令接口
class Command {
execute() {}
}
// 定义具体命令类
class ConcreteCommand extends Command {
constructor(receiver) {
super();
this.receiver = receiver;
}
execute() {
this.receiver.action();
}
}
// 定义接收者
class Receiver {
action() {
console.log("接收者执行操作。");
}
}
// 定义调用者
class Invoker {
setCommand(command) {
this.command = command;
}
executeCommand() {
this.command.execute();
}
}
// 创建接收者、命令和调用者对象
const receiver = new Receiver();
const command = new ConcreteCommand(receiver);
const invoker = new Invoker();
// 将命令传递给调用者,并执行命令
invoker.setCommand(command);
invoker.executeCommand(); // 输出:接收者执行操作。
以上是一些常见的 JavaScript 设计模式示例代码。这些示例代码只是用来说明设计模式的基本思想和实现方式,实际应用中可能需要更多的定制和细节处理。
学习关于JavaScript常用的8大设计模式的更多相关文章
- 7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...
- Javascript常用的设计模式详解
Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...
- 大数据学习之BigData常用算法和数据结构
大数据学习之BigData常用算法和数据结构 1.Bloom Filter 由一个很长的二进制向量和一系列hash函数组成 优点:可以减少IO操作,省空间 缺点:不支持删除,有 ...
- 前端学习(十七):JavaScript常用对象
进击のpython ***** 前端学习--JavaScript常用对象 JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等 在JavaScript中,对象是拥有属性和方法的数据 ...
- HTML 学习笔记 JavaScript(面向对象)
现在让我们继续跟着大神的脚步前进 学习一下JavaScript中的面向对象的思想,其实作为一个iOS开发者,对面向对象还是比较熟悉的,但是昨晚看了一下Js中的面向对象,妈蛋 一脸萌比啊.还好有大神.让 ...
- JavaScript 常用功能总结
小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模式. 目录: 众所周知,JavaScri ...
- Javascript学习1 - Javascript中的类型对象
原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...
- javascript常用知识汇总
javascript这个语言庞大而复杂,我用了三年多了,还是皮毛都不会.从刚开始的jquery,到后来的es6,每天都在学习,每天都在忘记. 1.禁止手机虚拟键盘弹出 在开发适配手机的页面时,出现了这 ...
- Java学习-005-初学常用的几个经典循环控制源代码
最近一段时间公司 App 改版,一直处在需求评审.代码评审.测试计划.测试用例.用例评审.用例执行.缺陷管理.测试总结的循环中,因而博客也好久没有更新了.虽然工作确实忙了点,但是也是自己懒惰了,从今天 ...
- 前端之JavaScript第一天学习(1)-JavaScript 简介
javaScript 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. JavaScript 是脚本语言 JavaSc ...
随机推荐
- xShell执行js脚本
var CMD = 'ls'; var INTERVAL = 1; var MAX = 5; var CR = String.fromCharCode(13); var LF = String.fro ...
- 无线电(手台、APRS)
泉胜手台操作:(TG-UV2)----------------------------------------------- MR/VFO: 频率模式指示F:信道模式指示M F+MAIN: 主副频转换 ...
- 网络游戏同步法则 -- skywind
转载出处:http://www.skywind.me/blog/archives/112 网路的硬件也有限,而人的创造也无限,在公网平均130ms的Latency下,是不存在"完全的&quo ...
- opengl编程天天踩的坑
1. VBO 的 target 是 GL_ARRAY_BUFFER 不是 GL_VERTEX_BUFFER 2. glUniform()用来给uniform传变量 别用成 glProgramUnif ...
- 磊磊零基础打卡算法:day20 c++dfs树的深度优先遍历
5.24 dfs深度优先搜索: 思想比较简单,就是一条路走到底,走到最深点处再回退一步,再看有没有路可以走,没有的话再回退一步,重复此步骤: 也是人们常讲的暴搜. 主要的用法: 通常需要一个状态数组来 ...
- Glinux 1395 build ENV setup
1.安装ubuntu 14.04.05 LTS 64bit 2.初始化root 密码 sudo passwd Password: <--- 输入安装时那个用户的密码 Enter new UN ...
- bash transpose csv
transpose() { awk ' BEGIN { FS = ","; OFS = ","; } { if (max_nf<NF) max_nf=NF ...
- node报错解决办法
依次报错: Error: Cannot find module 'gifsicle' Syntax Error: Error: Cannot find module 'imagemin-gifsicl ...
- 纯js实现字符串formate方法
function format(pattern){ if(! (pattern instanceof String)){ throw new TypeError("错误的参数类型" ...
- 基于AI边缘智能网关的工业质检应用
成品质量检验是工业生产最后必不可少的环节,随着我国工业化的蓬勃发展,工业产品日益迈向高端化.精密化,对于工业产品的质量检验要求和投入成本也在不断提高,产品质检涉及到比以往更多维度.更多零部件.更高精度 ...