informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Pola desain adalah solusi umum untuk masalah umum dalam desain perangkat lunak. Berikut ini adalah beberapa pola desain yang umum, dibagi menjadi tiga kategori utama: pola kreasi, pola struktural, dan pola perilaku.
Pola-pola ini menyediakan mekanisme untuk pembuatan objek, meningkatkan fleksibilitas dan penggunaan kembali kode yang ada.
Pola tunggal:
Pola Metode Pabrik:
Pola Pabrik Abstrak (Pabrik Abstrak):
Pola pembangun (Pembangun):
Prototipe:
Pola-pola ini berhubungan dengan kombinasi objek, atau hubungan antara objek dan objek tersebut.
Modus adaptor:
Pola dekorator (Dekorator):
Mode proksi (Proksi):
Tatapan:
Mode jembatan (Jembatan):
Modus komposit:
Modus kelas terbang:
Pola-pola ini fokus pada komunikasi antar objek, yaitu bagaimana objek berinteraksi dan mendistribusikan tanggung jawab.
Strategi:
Pola Metode Templat (Metode Templat):
Pola pengamat (Pengamat):
Pola Iterator (Iterator):
Model Rantai Tanggung Jawab:
Mode perintah (Perintah):
Modus kenang-kenangan:
Modus negara:
Modus pengunjung:
Pola perantara:
Mode juru bahasa (Penerjemah):
Pada wawancara terakhir, saya ditanya tentang penggunaan kode untuk mengimplementasikan pola pelanggan-penerbit. Saya sempat mensimulasikan pola desain ini dengan kode js.
Misalnya
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');
Dalam contoh ini,PubSub
Kelas menyediakan fungsionalitas berikut:
subscribe
Metode memungkinkan pelanggan untuk mendaftarkan fungsi panggilan balik ke acara tertentu.unsubscribe
Metode ini memungkinkan pelanggan untuk membatalkan pendaftaran fungsi panggilan balik mereka dari peristiwa tertentu.unsubscribeAll
Metode membatalkan semua langganan ke acara tertentu.emit
Metode ini memicu kejadian dan menjalankan fungsi panggilan balik semua pelanggan.hasSubscribers
Metode memeriksa apakah ada pelanggan untuk acara tertentu.