내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
디자인 패턴은 소프트웨어 디자인의 일반적인 문제에 대한 일반적인 솔루션입니다. 다음은 생성 패턴, 구조 패턴, 동작 패턴이라는 세 가지 주요 범주로 구분된 몇 가지 일반적인 디자인 패턴입니다.
이러한 패턴은 객체 생성을 위한 메커니즘을 제공하여 기존 코드의 유연성과 재사용성을 높입니다.
싱글톤 패턴:
팩토리 메소드 패턴:
추상 팩토리 패턴(추상 팩토리):
빌더 패턴(빌더):
원기:
이러한 패턴은 개체의 조합 또는 개체와 개체 간의 관계를 처리합니다.
어댑터 모드:
데코레이터 패턴(Decorator):
프록시 모드(프록시):
정면:
브리지 모드(브리지):
복합 모드:
플라이웨이트 모드:
이러한 패턴은 객체 간의 통신, 즉 객체가 상호 작용하고 책임을 분배하는 방식에 중점을 둡니다.
전략:
템플릿 메소드 패턴(Template Method):
옵저버 패턴(Observer):
반복자 패턴(Iterator):
책임 사슬 모델:
명령 모드(명령):
기념품 모드:
상태 모드:
방문자 모드:
중재자 패턴:
통역사 모드(통역사):
지난 인터뷰에서 코드를 사용하여 구독자-출판자 패턴을 구현하는 방법에 대해 질문을 받았습니다. 이러한 디자인 패턴을 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
메서드는 특정 이벤트에 대한 구독자가 있는지 확인합니다.