私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
設計パターンは、ソフトウェア設計における一般的な問題に対する一般的な解決策です。以下に、一般的なデザイン パターンをいくつか示します。これらは、作成パターン、構造パターン、動作パターンの 3 つの主要なカテゴリに分類されます。
これらのパターンはオブジェクト作成のメカニズムを提供し、既存のコードの柔軟性と再利用性を高めます。
シングルトンパターン:
ファクトリメソッドパターン:
抽象ファクトリー パターン (抽象ファクトリー):
ビルダーパターン(ビルダー):
プロトタイプ:
これらのパターンは、オブジェクトの組み合わせ、またはオブジェクトとオブジェクト間の関係を扱います。
アダプターモード:
デコレータパターン(デコレータ):
プロキシモード(プロキシ):
ファサード:
ブリッジモード(ブリッジ):
複合モード:
フライウェイトモード:
これらのパターンは、オブジェクト間の通信、つまりオブジェクトがどのように相互作用し、責任を分散するかに焦点を当てています。
戦略:
テンプレートメソッドパターン(テンプレートメソッド):
オブザーバーパターン(オブザーバー):
イテレータパターン(イテレータ):
責任連鎖モデル:
コマンドモード(コマンド):
メメントモード:
ステートモード:
ビジターモード:
メディエーターパターン:
通訳モード(通訳):
前回のインタビューでは、コードを使用してサブスクライバーとパブリッシャーのパターンを実装することについて質問されました。時間があったので、これらの設計パターンを 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
メソッドは、特定のイベントのサブスクライバーが存在するかどうかを確認します。