面试之《前端常见的设计模式》

embedded/2025/3/13 21:22:02/

前端开发中运用多种设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是一些常见的前端设计模式

创建型模式

1. 单例模式
  • 定义:确保一个类只有一个实例,并提供一个全局访问点。
  • 应用场景:在前端中,像全局状态管理对象、数据库连接对象等通常使用单例模式。例如,在 React 项目中使用 Redux 管理全局状态,Redux 的 store 就是一个单例,整个应用只有一个 store 实例。
  • 示例代码(JavaScript)
class Singleton {constructor() {if (!Singleton.instance) {this.data = [];Singleton.instance = this;}return Singleton.instance;}addItem(item) {this.data.push(item);}getData() {return this.data;}
}
const singleton1 = new Singleton();
const singleton2 = new Singleton();
console.log(singleton1 === singleton2); // true
2. 工厂模式
  • 定义:定义一个创建对象的接口,让子类决定实例化哪个类。
  • 应用场景:当创建对象的逻辑比较复杂时,使用工厂模式可以将对象的创建和使用分离。例如,在创建不同类型的弹窗组件时,可以使用工厂模式根据不同的参数创建不同样式和功能的弹窗。
  • 示例代码(JavaScript)
class Button {constructor(text) {this.text = text;}render() {return `<button>${this.text}</button>`;}
}class Link {constructor(text, url) {this.text = text;this.url = url;}render() {return `<a href="${this.url}">${this.text}</a>`;}
}class ElementFactory {createElement(type, ...args) {if (type === 'button') {return new Button(...args);} else if (type === 'link') {return new Link(...args);}return null;}
}const factory = new ElementFactory();
const button = factory.createElement('button', 'Click me');
const link = factory.createElement('link', 'Google', 'https://www.google.com');
console.log(button.render());
console.log(link.render());

结构型模式

1. 装饰器模式
  • 定义:动态地给一个对象添加一些额外的职责。
  • 应用场景:在前端中,常用于给组件添加额外的功能,如添加样式、事件处理等。例如,在 React 中可以使用高阶组件(HOC)来实现装饰器模式,给组件添加日志记录、权限验证等功能。
  • 示例代码(JavaScript)
function logDecorator(component) {return class extends React.Component {componentDidMount() {console.log('Component mounted');}render() {return <component {...this.props} />;}};
}class MyComponent extends React.Component {render() {return <div>My Component</div>;}
}const DecoratedComponent = logDecorator(MyComponent);
2. 代理模式
  • 定义:为其他对象提供一种代理以控制对这个对象的访问。
  • 应用场景:在前端中,常用于处理图片懒加载、数据缓存等。例如,使用代理对象来控制对图片资源的访问,当图片进入可视区域时再加载真实的图片资源。
  • 示例代码(JavaScript)
class Image {constructor(src) {this.src = src;this.loadImage();}loadImage() {console.log(`Loading image from ${this.src}`);}display() {console.log(`Displaying image from ${this.src}`);}
}class ProxyImage {constructor(src) {this.src = src;this.realImage = null;}display() {if (!this.realImage) {this.realImage = new Image(this.src);}this.realImage.display();}
}const proxy = new ProxyImage('https://example.com/image.jpg');
proxy.display();

行为型模式

1. 观察者模式
  • 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
  • 应用场景:在前端中,常用于实现事件系统、状态管理等。例如,在 Vue.js 中,响应式原理就是基于观察者模式实现的,当数据发生变化时,会自动更新与之绑定的 DOM 元素。
  • 示例代码(JavaScript)
class EventEmitter {constructor() {this.events = {};}on(eventName, callback) {if (!this.events[eventName]) {this.events[eventName] = [];}this.events[eventName].push(callback);}emit(eventName, ...args) {if (this.events[eventName]) {this.events[eventName].forEach(callback => callback(...args));}}off(eventName, callback) {if (this.events[eventName]) {this.events[eventName] = this.events[eventName].filter(cb => cb!== callback);}}
}const emitter = new EventEmitter();
const callback = (message) => {console.log(`Received message: ${message}`);
};
emitter.on('message', callback);
emitter.emit('message', 'Hello, world!');
emitter.off('message', callback);
emitter.emit('message', 'This message won\'t be received.');
2. 状态模式
  • 定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
  • 应用场景:在前端中,常用于实现组件的不同状态切换,如按钮的不同状态(正常、禁用、加载中)。
  • 示例代码(JavaScript)
class ButtonState {constructor(button) {this.button = button;}click() {}render() {}
}class NormalState extends ButtonState {click() {console.log('Button clicked');}render() {return '<button>Normal</button>';}
}class DisabledState extends ButtonState {click() {console.log('Button is disabled');}render() {return '<button disabled>Disabled</button>';}
}class Button {constructor() {this.state = new NormalState(this);}setState(state) {this.state = state;}click() {this.state.click();}render() {return this.state.render();}
}const button = new Button();
button.click();
button.setState(new DisabledState(button));
button.click();

以上只是前端开发中常见的一些设计模式,实际应用中可以根据具体需求选择合适的设计模式来优化代码。


http://www.ppmy.cn/embedded/172351.html

相关文章

Linux 常用 20 条指令,解决大部分问题

find&#xff1a;查找文件和目录 例:find /-name error.log 在/根目录下开始查找&#xff0c;名字为 error.log 的文件 ps&#xff1a;查看当前进程信息 例:ps -ef -e 代表显示所有进程 -f 代表使用详细的进程信息 vi&#xff1a;Linux 系统中重要的文本编辑工具 例:vi dm…

python之数据处理的安全(链家)

一、模块设计思路与核心价值 # 代码核心安全处理逻辑 element soup.select_one(css_selector) if element else default_value设计目标&#xff1a;构建具备自愈能力的爬虫系统&#xff0c;应对网页改版、反爬策略、网络抖动等复杂场景 核心价值&#xff1a; 数据完整性保障…

Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)

概念 事务定义 事务&#xff0c;就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行&#xff0c;我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行&#xff0c;我们称该事务被提交。…

详细介绍ListView_DeleteItem

书籍&#xff1a;《Visual C 2017从入门到精通》的2.3.8 Win32控件编程 环境&#xff1a;visual studio 2022 内容&#xff1a;【例2.27】支持按Delete键删除某行的列表视图控件 说明&#xff1a;以下内容大部分来自腾讯元宝。 以下是关于**ListView_DeleteItem**函数的详细…

20250310:OpenCV mat对象与base64互转

代码: https://github.com/ReneNyffenegger/cpp-base64 指南:https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp/ 实操:

C++程序设计语言笔记——基本功能:异常处理

0 在设计初期尽早确定异常处理策略。 在C中&#xff0c;设计初期的异常处理策略需要紧密结合语言特性&#xff08;如RAII、异常安全等级、智能指针&#xff09;和性能要求。以下是一套针对C的异常处理设计框架&#xff0c;包含代码示例和最佳实践&#xff1a; 1. 异常分类与标…

订单超时自动取消的4种实现方案:从定时任务到时间轮

在电商、外卖等场景中,订单超时自动取消是保障系统健壮性的核心功能。本文将深入解析4种实现方案,包含可直接运行的SpringBoot代码,并对比各方案在10万级订单量下的性能表现,帮你选型最适合业务场景的技术方案。 一、需求分析与技术挑战 ‌典型业务场景‌: 用户下单后30…

有必要使用 Oracle 向量数据库吗?

向量数据库最主要的特点是让传统的只能基于具体值/关键字的数据检索&#xff0c;进化到了可以直接基于语义的数据检索。这在AI时代至关重要&#xff01; 回到标题问题&#xff1a;是否有必要使用 Oracle 向量数据库&#xff1f; 这实际还要取决于你的具体应用需求。 客观来讲…