моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Шаблоны проектирования — это общие решения распространенных проблем при проектировании программного обеспечения. Ниже приведены некоторые распространенные шаблоны проектирования, разделенные на три основные категории: шаблоны создания, структурные шаблоны и поведенческие шаблоны.
Эти шаблоны предоставляют механизмы создания объектов, повышая гибкость и возможность повторного использования существующего кода.
Шаблон синглтона:
Шаблон фабричного метода:
Шаблон «Абстрактная фабрика» (Абстрактная фабрика):
Выкройка Строитель (Builder):
Опытный образец:
Эти шаблоны имеют дело с комбинациями объектов или отношениями между объектами и ними.
Режим адаптера:
Паттерн Декоратор (Декоратор):
Режим прокси (Прокси):
Фасад:
Режим моста (Мост):
Композитный режим:
Режим наилегчайшего веса:
Эти шаблоны сосредоточены на взаимодействии между объектами, то есть на том, как объекты взаимодействуют друг с другом и как они распределяют обязанности.
Стратегия:
Шаблон «Метод шаблона» (Шаблонный метод):
Паттерн «Наблюдатель» (Наблюдатель):
Шаблон итератора (Итератор):
Модель цепочки ответственности:
Командный режим (Командный):
Режим сувенира:
Режим состояния:
Режим посетителя:
Шаблон посредника:
Режим переводчика (Интерпретатор):
Во время последнего интервью меня спросили об использовании кода для реализации шаблона «подписчик-издатель». У меня было время смоделировать эти шаблоны проектирования с помощью js-кода.
Например
class PubSub {
constructor() {
this.events = {}; // 存储事件名称和对应的订阅者回调函数数组
}
// 订阅事件
subscribe(event, callback) {
if (!this.events[event]) {
this.events[event] = []; // 如果事件不存在,初始化一个空数组
}
this.events[event].push(callback); // 将回调函数添加到订阅者的数组
}
// 取消订阅事件
unsubscribe(event, callback) {
if (!this.events[event]) {
return;
}
this.events[event] = this.events[event].filter(cb => cb !== callback); // 移除指定的回调函数
}
// 取消特定事件的所有订阅
unsubscribeAll(event) {
if (this.events[event]) {
delete this.events[event]; // 删除所有订阅者
}
}
// 触发事件,使用 emit 作为方法名
emit(event, data) {
if (this.events[event]) {
// 执行所有订阅者的回调函数
this.events[event].forEach(callback => callback(data));
}
}
// 检查是否有订阅者
hasSubscribers(event) {
return this.events[event] && this.events[event].length > 0;
}
}
// 使用示例
const eventCenter = new PubSub();
// 订阅 'message' 事件
eventCenter.subscribe('message', (data) => {
console.log(`Message received: ${data}`);
});
// 订阅 'greet' 事件
eventCenter.subscribe('greet', (name) => {
console.log(`Hello, ${name}!`);
});
// 触发 'message' 事件
eventCenter.emit('message', 'Hello, Pub/Sub!');
// 触发 'greet' 事件
eventCenter.emit('greet', 'World');
// 取消对 'message' 事件的订阅
const myCallback = (data) => {
console.log(`My callback received: ${data}`);
};
eventCenter.subscribe('message', myCallback);
eventCenter.unsubscribe('message', myCallback);
// 再次触发 'message' 事件,myCallback 不会被调用
eventCenter.emit('message', 'This message will not be received by myCallback');
В этом примереPubSub
Класс предоставляет следующие функциональные возможности:
subscribe
Метод позволяет подписчикам зарегистрировать функцию обратного вызова для определенного события.unsubscribe
Метод позволяет подписчикам отменить регистрацию своих функций обратного вызова для определенных событий.unsubscribeAll
Метод отменяет все подписки на определенное событие.emit
Метод запускает событие и выполняет функции обратного вызова всех подписчиков.hasSubscribers
Метод проверяет, есть ли подписчики на конкретное событие.