Berbagi teknologi

Ringkasan pola desain perangkat lunak

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 Penciptaan

Pola-pola ini menyediakan mekanisme untuk pembuatan objek, meningkatkan fleksibilitas dan penggunaan kembali kode yang ada.

  1. Pola tunggal

    • Pastikan hanya ada satu instance kelas dan sediakan titik akses global.
  2. Pola Metode Pabrik

    • Tentukan antarmuka untuk membuat objek dan biarkan subkelas memutuskan kelas mana yang akan dibuat instance-nya.
  3. Pola Pabrik Abstrak (Pabrik Abstrak)

    • Buat kelompok objek terkait atau dependen tanpa menentukan kelas konkret secara eksplisit.
  4. Pola pembangun (Pembangun)

    • Bangun objek yang kompleks dan izinkan konstruksi langkah demi langkah.
  5. Prototipe

    • Buat instance baru dengan menyalin instance yang sudah ada, bukan membuat instance baru.

Pola Struktural

Pola-pola ini berhubungan dengan kombinasi objek, atau hubungan antara objek dan objek tersebut.

  1. Modus adaptor

    • Memungkinkan ketidakcocokan antarmuka antar objek diselesaikan melalui "adaptor".
  2. Pola dekorator (Dekorator)

    • Menambahkan tanggung jawab tambahan secara dinamis ke suatu objek.
  3. Mode proksi (Proksi)

    • Menyediakan pengganti atau pengganti objek lain untuk mengontrol akses ke objek tersebut.
  4. Tatapan

    • Menyediakan antarmuka tingkat tinggi terpadu untuk mengakses sekelompok antarmuka dalam subsistem.
  5. Mode jembatan (Jembatan)

    • Pisahkan bagian abstrak dari implementasinya sehingga dapat bervariasi secara mandiri.
  6. Modus komposit

    • Kelompokkan objek ke dalam struktur pohon untuk mewakili hierarki sebagian-keseluruhan.
  7. Modus kelas terbang

    • Mendukung objek berukuran besar secara efisien melalui berbagi.

Pola Perilaku

Pola-pola ini fokus pada komunikasi antar objek, yaitu bagaimana objek berinteraksi dan mendistribusikan tanggung jawab.

  1. Strategi

    • Tentukan serangkaian algoritme, rangkum satu per satu, dan buat agar dapat dipertukarkan.
  2. Pola Metode Templat (Metode Templat)

    • Tentukan kerangka algoritma dalam metode dan tunda implementasi ke subkelas.
  3. Pola pengamat (Pengamat)

    • Hubungan ketergantungan satu-ke-banyak antar objek. Ketika suatu objek berubah status, semua objek yang bergantung padanya akan diberitahu dan diperbarui secara otomatis.
  4. Pola Iterator (Iterator)

    • Akses elemen individual dalam objek agregat secara berurutan tanpa memperlihatkan representasi internalnya.
  5. Model Rantai Tanggung Jawab

    • Berikan kesempatan pada banyak objek untuk menangani permintaan, sehingga menghindari penggabungan antara pengirim dan penerima permintaan.
  6. Mode perintah (Perintah)

    • Mengenkapsulasi permintaan sebagai objek, memungkinkan pengguna untuk membuat parameter klien dengan permintaan yang berbeda.
  7. Modus kenang-kenangan

    • Tangkap keadaan internal suatu objek dan simpan keadaan ini di luar objek tanpa merusak enkapsulasi.
  8. Modus negara

    • Mengizinkan suatu objek mengubah perilakunya ketika keadaan internalnya berubah.
  9. Modus pengunjung

    • Menambahkan kemampuan baru ke struktur objek (seperti struktur komposit).
  10. Pola perantara

    • Tentukan objek perantara untuk menyederhanakan interaksi antara objek asli.
  11. Mode juru bahasa (Penerjemah)

    • Tentukan representasi tata bahasa suatu bahasa dan tafsirkan kalimat yang didefinisikan dalam bahasa itu.

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');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

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.