Apa perbedaan antara pola jembatan dan pola strategi?

114

Saya mencoba membaca banyak artikel di dofactory , wikipedia dan banyak situs. Saya tidak tahu perbedaan antara pola jembatan dan pola strategi.

Saya tahu keduanya memisahkan abstraksi dari implementasinya dan dapat mengubah implementasi pada waktu proses.

Tapi saya masih belum tahu dalam situasi apa saya harus menggunakan strategi atau dalam situasi apa saya harus menggunakan bridge.

Krirk
sumber

Jawaban:

66

Semantik. Dari wikipedia :

Diagram kelas UML untuk pola Strategi sama dengan diagram untuk pola Bridge. Namun, kedua pola desain ini tidak sama maksudnya. Sementara pola Strategi dimaksudkan untuk perilaku, pola Jembatan dimaksudkan untuk struktur.

Kopling antara konteks dan strategi lebih erat daripada gabungan antara abstraksi dan implementasi dalam pola Bridge.

Seperti yang saya pahami, Anda menggunakan pola strategi saat Anda mengabstraksi perilaku yang dapat disediakan dari sumber eksternal (misalnya config dapat menentukan untuk memuat beberapa rakitan plugin), dan Anda menggunakan pola jembatan saat Anda menggunakan konstruksi yang sama untuk membuat kode Anda sedikit lebih rapi. Kode sebenarnya akan terlihat sangat mirip - Anda hanya menerapkan pola untuk alasan yang sedikit berbeda .

Kent Boogaart
sumber
3
jadi dapatkah saya mengatakan bahwa saya menggunakan pola strategi untuk dapat mengabstraksikan perilaku sekaligus membuat kode terlihat lebih rapi seperti dalam pola jembatan .. atau, saya menggunakan pola Bridge untuk membuat kode lebih rapi dan juga karena memungkinkan saya ke perilaku abstrak seperti dalam pola strategi? dan apakah saya benar?
pengguna20358
1
Perbedaan antara keduanya hanya pada niat mereka. Jadi saya rasa kita bisa dengan aman mengatakan bahwa, karena keduanya menggunakan ide yang sama dan menawarkan fleksibilitas yang sama, kedua pola tersebut berfungsi sama.
Elz
3
UML Bridge sangat berbeda dengan salinan buku GoF saya. Alat ini mampu membedakan Bridge dari Strategy.
Fuhrmanator
1
Wikipedia sering kali menjadi referensi yang buruk. Benar, kesalahan informasi itu telah dihapus dari halaman. en.wikipedia.org/w/…
Fuhrmanator
2
Cara saya mendapatkannya adalah bahwa teknik yang sama digunakan untuk mengabstraksi implementasi (strategi) atau abstrak antarmuka (jembatan). Perilaku pertukaran strategi, antarmuka pertukaran jembatan (ini pada akhirnya memungkinkan implementasi dengan antarmuka seperti itu untuk ditukar). Dengan kata lain Bridge membuat antarmuka standar di satu sisi dan menyambungkan implementasi dengan antarmuka berbeda di sisi lain.
Nikaas
55

Pola Bridge adalah pola struktural (BAGAIMANA ANDA MEMBANGUN KOMPONEN PERANGKAT LUNAK?). Pola Strategi adalah pola dinamis (BAGAIMANA ANDA INGIN MENJALANKAN PERILAKU DI PERANGKAT LUNAK?).

Sintaksnya serupa tetapi tujuannya berbeda:

  • Strategi : Anda memiliki lebih banyak cara untuk melakukan operasi; dengan strategi, Anda dapat memilih algoritme saat menjalankan dan Anda dapat mengubah satu Strategi tanpa banyak efek samping pada waktu kompilasi;
  • Bridge : Anda dapat membagi hierarki antarmuka dan kelas, menggabungkannya dengan referensi abstrak (lihat penjelasan )
alepuzio.dll
sumber
3
jadi jika sintaksnya serupa, apakah saya benar dengan mengatakan bahwa saya menggunakan salah satu pola tersebut untuk menjalankan perilaku perangkat lunak dengan cara tertentu dan juga karena saya ingin membangun komponen dengan cara tersebut sehingga terlihat rapi juga?
pengguna20358
11

Strategi:

  • Konteks terkait dengan Strategi: Kelas konteks (mungkin Abstrak tetapi sebenarnya bukan antarmuka! Karena Anda ingin merangkum perilaku tertentu dan bukan seluruh implementasi) akan mengetahui / berisi referensi antarmuka strategi dan implementasi untuk memanggil perilaku strategi pada Itu.
  • Intent adalah kemampuan untuk menukar perilaku saat runtime

    class Context {
    
         IStrategy strategyReference;
    
         void strategicBehaviour() {
    
            strategyReference.behave();
         }
    
    }
    

Menjembatani

  • Abstraksi tidak terikat dengan Implementasi: Antarmuka abstraksi (atau kelas abstrak dengan sebagian besar perilaku abstrak) tidak akan tahu / berisi referensi antarmuka implementasi
  • Maksudnya adalah untuk sepenuhnya memisahkan Abstraksi dari Implementasi

    interface IAbstraction {
    
        void behaviour1();
    
        .....
    
    }
    
    interface IImplementation {
    
         void behave1();
    
         void behave2();
    
         .....
    
    }
    
    class ConcreteAbstraction1 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationA() // Some implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave1();
    
          }
    
          .............
    
    }
    
    class ConcreteAbstraction2 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationB() // Some Other implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave2();
    
          }
    
          .............
    
    }
    
MEER
sumber
10

Saya juga memikirkan hal yang sama, tetapi baru-baru ini saya harus menggunakan bridge dan menyadari bahwa bridge menggunakan strategi dan menambahkan abstraksi ke konteksnya sehingga Anda nantinya dapat membuat lebih banyak perubahan tanpa mengubah klien. Saat menggunakan Strategi tanpa abstraksi, desainnya tidak sefleksibel dan mungkin memerlukan perubahan pada klien nanti. Namun saat menggunakan keseluruhan jembatan, desainnya menjadi lebih fleksibel. Di sini Anda dapat melihat bagaimana beralih dari Strategi ke Jembatan memberi lebih banyak fleksibilitas. Juga kami berasumsi bahwa sekarang "visa" dan "master" tidak hanya tersedia di kartu tetapi juga di telepon dan chip; dan jika kita menggunakan jembatan, jauh lebih mudah untuk menambahkan dukungan itu.

Strategi VS Jembatan

Orhan
sumber
9

Bridge : (Pola struktural)

Pola jembatan memisahkan abstraksi dan implementasi dan memungkinkan keduanya bervariasi secara independen.

Gunakan pola ini ketika:

  1. Abstraksi dan implementasi belum diputuskan pada waktu kompilasi
  2. Abstraksi dan implementasi harus diubah secara independen
  3. Perubahan dalam implementasi abstraksi seharusnya tidak mempengaruhi aplikasi pemanggil
  4. Klien harus diisolasi dari detail implementasi.

Strategi: (Pola perilaku)

Pola strategi memungkinkan Anda untuk beralih di antara beberapa algoritme dari keluarga algoritme pada saat berjalan.

Gunakan pola Strategi ketika:

  1. Beberapa versi algoritme diperlukan
  2. Perilaku kelas harus diubah secara dinamis pada waktu berjalan
  3. Hindari pernyataan bersyarat

Pos terkait:

Kapan Anda menggunakan Pola Jembatan? Apa bedanya dengan pola Adaptor?

Contoh Pola Strategi Dunia Nyata

Ravindra babu
sumber
4

Jenis pola desain

  • Perilaku: pola mencirikan cara kelas atau objek berinteraksi dan mendistribusikan tanggung jawab
  • Struktural: pola berhubungan dengan komposisi kelas atau objek.
  • Penciptaan: pola memperhatikan proses penciptaan objek.

Jembatan (Struktural)

Pisahkan abstraksi dari implementasinya sehingga masing-masing dapat berbeda. mandiri. masukkan deskripsi gambar di sini

Ambil remote. Remote memiliki tombol 1-6. Ini adalah kelas beton pada diagram di atas. Setiap tombol akan bekerja berbeda tergantung pada apakah remote digunakan untuk TV atau DVD. Fungsionalitas untuk setiap tombol disarikan dari implementasi oleh antarmuka pelaksana.

Ini memungkinkan kami mengubah cara kerja remote untuk setiap perangkat.

Strategi (Perilaku)

Tentukan keluarga algoritme, rangkum masing-masing algoritme, dan buat algoritme tersebut dapat dipertukarkan. masukkan deskripsi gambar di sini

Secara strategi, jika kita melihat skenario jarak jauh. "Status" adalah seluruh jarak jauh yang kami tukar dengan mengubah referensi status konteks. The "concreteStateA" (remote TV) "concreteStateB" (Remote DVD).

Bacaan tambahan:

Daniel
sumber
3
  1. Pola Strategi digunakan untuk keputusan Perilaku, sedangkan Pola Jembatan digunakan untuk keputusan Struktural.

  2. Pola Brigde memisahkan elemen abstrak dari detail implementasi, sedangkan Pola Strategi berkaitan dengan membuat algoritme lebih dapat dipertukarkan.

Pola Strategi di UML

Pola Brigde di UML

Pola Strategi di Swift:

protocol PrintStrategy {
   func print(_ string: String) -> String
}

class Printer {
   let strategy: PrintStrategy

   init(strategy: PrintStrategy) {
      self.strategy = strategy
    }

  func print(_ string: String) -> String {
     return self.strategy.print(string)
  }
}

class UpperCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.uppercased()
    }
}

class LowerCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.lowercased()
    }
}

var lower = Printer(strategy: LowerCaseStrategy())
lower.print("I love Software Patterns")

var upper = Printer(strategy: UpperCaseStrategy())
upper.print("I love Software Patterns")

Pola Brigde di Swift:

protocol Appliance {
   func run()
}

protocol Switch {
   let appliance: Appliance {get set}
   func turnOn()
}

class RemoteControl: Switch {
   var appliance: Appliance

   init(appliance: Appliance) {
       self.appliance = appliance
   }

   internal func turnOn() {
      appliance.run()
   }
}

class TV: Appliance {
   internal func run() {
      print("TV is ON")
   }
}

class Stereo: Appliance {
   internal func run() {
      print("Stereo is ON")
   }
}

var tvRemote = RemoteControl.init(appliance: TV())
tvRemote.turnOn()

var stereoRemote = RemoteControl.init(appliance: Stereo())
stereoRemote.turnOn()
Joan Disho
sumber
kenapa hanya pola strategi yang lebih "dipertukarkan". Karena kita membuat kode untuk antarmuka, bukan ke implementasi, kita dapat menukar implementasi dalam strategi, atau jembatan, seperti yang Anda tunjukkan dalam contoh kode Anda, bertukar Stereodengan TVdan kodenya langsung berfungsi.
denis631
2

Menambahkan jawaban willcodejavaforfood, mereka bisa sama, dalam implementasi. Bagaimanapun Anda menggunakan strategi untuk menukar strategi seperti strategi pengurutan, sementara Anda menggunakan jembatan untuk menjembatani implementasi dua objek, katakanlah pembungkus database, dan adaptor jaringan sehingga kode klien dapat menggunakan baik yang bekerja pada API yang sama. Jadi penamaan itu menjelaskan semuanya

Robert Gould
sumber
1

Dari wiki tentang pola Strategi

Diagram kelas UML untuk pola Strategi sama dengan diagram untuk pola Bridge. Namun, kedua pola desain ini tidak sama maksudnya. Sementara pola Strategi dimaksudkan untuk perilaku, pola Jembatan dimaksudkan untuk struktur.

Kopling antara konteks dan strategi lebih erat daripada gabungan antara abstraksi dan implementasi dalam pola Bridge.

willcodejavaforfood
sumber
Bisakah Anda menjelaskan kalimat terakhir?
gstackoverflow
1

Hanya untuk menambah apa yang telah dikatakan tentang perbandingan pola (perbedaan maksud, ...): pola Bridge juga sengaja disusun untuk memungkinkan sisi hierarki abstraksi bervariasi. Dalam bahasa seperti C #, hal ini dapat berarti Anda memiliki basis abstraksi yang berisi metode virtual sebagai cara untuk memungkinkan variasi yang diinginkan yang tidak menimbulkan masalah bagi konsumen yang ada. Selain itu, kedua pola tersebut mungkin tampak identik untuk sebagian besar.

Burt
sumber
1

Pola strategi digunakan ketika Anda ingin memasukkan algoritma atau strategi pada saat run time. Sebagai kategori pola juga menyiratkan bahwa itu berkaitan dengan perilaku objek. Di sisi lain jembatan adalah pola struktural dan berhubungan dengan hierarki struktural objek. Ini memisahkan abstraksi dari implementasi dengan memperkenalkan abstraksi halus di antara mereka. Abstraksi yang disempurnakan dapat disalahartikan dengan strategi waktu proses yang dipasang (pola Strategi). Pola jembatan berkaitan dengan aspek struktural dengan menyediakan mekanisme untuk menghindari pembuatan n sejumlah kelas.

Pranav Sharma
sumber
1

Untuk pola strategi hanya implementasinya yang bervariasi.

Misalkan, kelas A menggunakan kelas B yang memiliki beberapa implementasi yang tersedia. Jadi dalam kasus B akan menjadi abstrak dengan implementasi aktual yang disediakan pada waktu proses. Ini adalah pola strategi

Sekarang jika A itu sendiri abstrak. Baik A dan B mungkin berbeda. Anda akan menggunakan pola Bridge.

Ritesh Tyagi
sumber
0

Saya pikir ada sedikit perbedaan di antara keduanya dalam konteks penggunaannya.

Saya menggunakan pola Bridge untuk memisahkan konsep ortogonal yang keduanya termasuk dalam konsep yang lebih besar - untuk membedakannya secara independen. Biasanya melibatkan banyak abstraksi.

IMO, pola Strateginya lebih sederhana atau lebih datar. Ini berfungsi untuk OCP pasti tetapi tidak harus menjadi bagian dari konsep lain dan lebih besar seperti pola Bridge.

stdout
sumber