Köprü kalıbı ile strateji kalıbı arasındaki fark nedir?


114

Dofactory , wikipedia ve birçok site hakkında birçok makale okumaya çalıştım . Köprü modeli ile strateji modeli arasındaki farklar hakkında hiçbir fikrim yok.

Her ikisinin de bir soyutlamayı uygulamasından ayırdığını ve uygulamayı çalışma zamanında değiştirebileceğini biliyorum.

Ama yine de hangi durumda strateji kullanmalıyım veya hangi durumda briç kullanmalıyım bilmiyorum.

Yanıtlar:


66

Semantik. Gönderen wikipedia :

Strateji modeli için UML sınıf diyagramı, Köprü modelinin diyagramı ile aynıdır. Bununla birlikte, bu iki tasarım modeli amaçlarında aynı değildir. Strateji modeli davranış içindir, Köprü modeli ise yapı içindir.

Bağlam ve stratejiler arasındaki bağlantı, Köprü modelindeki soyutlama ve uygulama arasındaki bağlantıdan daha sıkıdır.

Anladığım kadarıyla, harici bir kaynaktan sağlanabilecek davranışı soyutlarken strateji modelini kullanıyorsunuz (ör. Config, bazı eklenti derlemelerini yüklemeyi belirtebilir) ve kullandığınızda köprü modelini kullanıyorsunuz kodunuzu biraz daha düzgün hale getirmek için aynı yapılar. Gerçek kod çok benzer görünecektir - sadece kalıpları uyguluyorsunuz biraz farklı nedenlerle .


3
Bu yüzden, davranışı soyutlayabilmek için strateji modelini kullandığımı ve aynı zamanda kodu köprü deseninde olduğu gibi daha düzgün gösterdiğimi söyleyebilir miyim .. veya, Bridge modelini kodu daha düzgün yapmak için kullanıyorum ve ayrıca bana izin verdiği için strateji modelindeki gibi soyut davranışa mı? ve haklı olur muyum?
user20358

1
İkisi arasındaki fark sadece niyetlerinde. Bu yüzden, her ikisi de aynı fikri kullandığı ve aynı esnekliği sağladığı için, iki modelin işlevsel olarak aynı olduğunu rahatlıkla söyleyebiliriz sanırım.
Elz

3
Bridge'in UML'si, GoF kitabımın kopyasında oldukça farklı . Bu araç , Bridge'i Stratejiden ayırabilir.
Fuhrmanator

1
Wikipedia genellikle korkunç bir referanstır. Haklı olarak, bu yanlış bilgi sayfadan kaldırıldı. en.wikipedia.org/w/…
Fuhrmanator

2
Anladığım kadarıyla aynı teknik bir uygulamayı (strateji) soyutlamak veya bir arayüzü (köprü) soyutlamak için kullanılıyor. Strateji değiş tokuş davranışları, Köprü takas arabirimleri (bu, sonuçta bu tür arabirimlerle uygulamaların değiştirilmesine izin verir). Başka bir deyişle, Bridge bir tarafta standartlaştırılmış arayüz oluşturur ve diğer tarafta farklı arayüzlere sahip uygulamaları takar.
Nikaas

55

Köprü kalıbı yapısal bir kalıptır (BİR YAZILIM BİLEŞENİNİ NASIL YAPARSINIZ?). Strateji modeli dinamik bir modeldir (YAZILIMDA NASIL BİR DAVRANIŞI ÇALIŞTIRMAK İSTİYORSUNUZ?).

Sözdizimi benzerdir ancak hedefler farklıdır:

  • strateji : Bir operasyon yapmak için daha fazla yolunuz var; strateji ile, algoritmayı çalışma zamanında seçebilir ve tek bir Stratejiyi derleme zamanında çok fazla yan etki olmadan değiştirebilirsiniz;
  • Köprü : Arayüz ve sınıf hiyerarşisini bölebilir, soyut bir referansla birleştirebilirsiniz ( açıklamaya bakın) )

3
eğer sözdizimi benzerse, bir yazılım davranışını belirli bir şekilde çalıştırmak için bu modellerden birini kullandığımı ve ayrıca bileşeni bu şekilde inşa etmek istediğim için de düzgün görünmesini sağlamak için doğru olur muyum?
user20358

11

Strateji:

  • Stratejiye bağlı bağlam: Bağlam Sınıfı (muhtemelen Özet ama gerçekten bir arayüz değil! Çünkü belirli bir davranışı kapsamak ve tüm uygulamayı değil) strateji arayüz referansını ve strateji davranışını çağırmak için uygulamayı bilecek / içerecektir . o.
  • Amaç, çalışma zamanında davranışı değiştirebilme yeteneğidir

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

Köprü

  • Uygulamaya bağlı olmayan soyutlama: Soyutlama arayüzü (veya davranış özetinin çoğunu içeren soyut sınıf), uygulama arayüzü referansını bilmeyecek / içermeyecektir.
  • Amaç, Soyutlamayı Uygulamadan tamamen ayırmaktır.

    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();
    
          }
    
          .............
    
    }
    

10

Ben de aynı şeyi düşünüyordum, ancak son zamanlarda bridge'i kullanmak zorunda kaldım ve köprünün stratejiyi kullandığını ve bağlama soyutlama eklediğini fark ettim, böylece daha sonra müşteriyi değiştirmeden daha fazla değişiklik yapabilirsiniz. Stratejiyi soyutlama olmadan kullanırken, tasarım o kadar esnek değildir ve daha sonra müşteride değişiklikler gerektirebilir. Ancak tüm köprüyü kullanırken tasarım daha da esnek hale gelir. Burada, Stratejiden Bridge'e geçmenin nasıl daha fazla esneklik sağladığını görebilirsiniz. Ayrıca artık "visa" ve "master" ın yalnızca kartlarda değil, telefonlarda ve çiplerde de mevcut olduğunu varsayıyoruz; ve eğer köprü kullanırsak bu desteği eklemek çok daha kolay.

Strateji VS Köprü


9

Köprü : (Yapısal bir model)

Köprü paterni, soyutlamayı ve uygulamayı ayırır ve her ikisinin de bağımsız olarak değişmesine izin verir.

Bu kalıbı şu durumlarda kullanın:

  1. Derleme sırasında soyutlamalar ve uygulamalara karar verilmedi
  2. Soyutlamalar ve uygulamalar bağımsız olarak değiştirilmelidir
  3. Soyutlamanın uygulanmasındaki değişiklikler arayan uygulamasını etkilememelidir
  4. Müşteri, uygulama detaylarından izole edilmelidir.

Strateji: (Davranışsal kalıp)

Strateji kalıpları, çalışma zamanında bir algoritma ailesinden birden çok algoritma arasında geçiş yapmanızı sağlar.

Şu durumlarda Strateji modelini kullanın:

  1. Algoritmaların birden çok sürümü gereklidir
  2. Sınıfın davranışı çalışma zamanında dinamik olarak değiştirilmelidir
  3. Koşullu ifadelerden kaçının

İlgili Mesajlar:

Köprü Modelini ne zaman kullanıyorsunuz? Adaptör modelinden farkı nedir?

Strateji Modelinin Gerçek Dünyadan Örneği


4

Tasarım deseni türleri

  • Davranışsal: kalıplar, sınıfların veya nesnelerin etkileşime girme ve sorumluluğu dağıtma yollarını karakterize eder
  • Yapısal: desenler sınıfların veya nesnelerin bileşimi ile ilgilenir.
  • Yaratıcılık: kalıplar, nesne yaratma süreciyle ilgilidir.

Köprü (Yapısal)

Her birinin farklı olabilmesi için bir soyutlamayı uygulamasından ayırın. bağımsız. görüntü açıklamasını buraya girin

Uzaktan kumandayı al. Uzaktan kumandanın 1-6 düğmeleri vardır. Bu, yukarıdaki şemadaki somut sınıftır. Uzaktan kumandanın TV veya DVD için kullanılıp kullanılmadığına bağlı olarak her düğme farklı çalışacaktır. Her düğmenin işlevselliği, uygulayıcı arabirimi tarafından uygulamadan soyutlanmıştır.

Bu, uzaktan kumandanın her cihaz için nasıl çalışacağını değiştirmemize olanak tanır.

Strateji (Davranışsal)

Bir algoritma ailesi tanımlayın, her birini kapsülleyin ve birbirinin yerine kullanılabilir hale getirin. görüntü açıklamasını buraya girin

Stratejide, uzak senaryoya bakarsak. "Durum", bağlamın durum referansını değiştirerek değiştirdiğimiz uzaktan kumandanın tamamıdır. "ConcreteStateA" (TV uzaktan kumandası) "ConcreteStateB" (DVD Uzaktan Kumandası).

Ek okuma:


3
  1. Strateji Modeli, Davranışsal kararlar için kullanılırken, Yapısal kararlar için Köprü Modeli kullanılır.

  2. Brigde Pattern, soyut öğeleri uygulama ayrıntılarından ayırırken, Strategy Pattern algoritmaları daha değiştirilebilir hale getirmekle ilgilenir.

UML'de Strateji Modeli

UML'de Brigde Deseni

Swift'de Strateji Modeli:

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")

Swift Brigde Deseni:

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()

nasıl olur da sadece strateji modeli daha "değiştirilebilir" olur. Eğer, sizin kod örneğinde gösterildiği takas olarak arayüzüne biz kod beri değil uygulanmasına, biz, strateji veya köprüsünde uygulamaları takas edebilir Stereoile TVve kod sadece çalışır.
denis631

2

Willcodejavaforfood'un cevabına ek olarak, uygulamada aynı olabilirler. Ancak, iki nesnenin uygulamalarını köprülemek için köprü kullanırken, örneğin bir veritabanı sarmalayıcısı ve bir ağ bağdaştırıcısının istemci kodunun aynı API'ye karşı her iki çalışmayı da kullanabilmesi için strateji kullanırken, sıralama stratejisi gibi stratejileri değiştirmek için stratejiyi kullanırsınız. Yani adlandırma aslında her şeyi söylüyor


1

Strateji kalıbı üzerine wiki'den

Strateji modeli için UML sınıf diyagramı, Köprü modelinin diyagramı ile aynıdır. Bununla birlikte, bu iki tasarım modeli amaçlarında aynı değildir. Strateji modeli davranış içindir, Köprü modeli ise yapı içindir.

Bağlam ve stratejiler arasındaki bağlantı, Köprü modelindeki soyutlama ve uygulama arasındaki bağlantıdan daha sıkıdır.


Son cümleyi açıklar mısınız?
gstackoverflow

1

Model karşılaştırması hakkında daha önce söylenenlere eklemek için (niyet farkı, ...): Köprü modeli, soyutlama hiyerarşisi tarafının değişmesine izin verecek şekilde kasıtlı olarak yapılandırılmıştır. C # gibi dillerde bu, mevcut tüketiciler için sorun yaratmayan amaçlanan varyasyonlara izin vermenin bir yolu olarak sanal yöntemler içeren bir soyutlama tabanına sahip olduğunuz anlamına gelebilir. Bunun dışında iki model çoğu zaman aynı görünebilir.


1

Strateji kalıbı, çalışma zamanında algoritma veya strateji eklemek istediğinizde kullanılır. Kalıp kategorisi aynı zamanda nesnelerin davranışlarıyla ilgilendiğini ima eder. Öte yandan köprü yapısal bir modeldir ve nesnelerin yapısal hiyerarşisiyle ilgilenir. Aralarına rafine bir soyutlama getirerek soyutlamayı uygulamadan ayırır. Rafine soyutlama, çalıştırma süresi stratejisi takılıyken karıştırılabilir (In Strategy modeli). Köprü modeli, n sayıda sınıf oluşturmaktan kaçınmak için bir mekanizma sağlayarak yapısal unsurlarla ilgilenir.


1

Yalnızca strateji modeli için uygulama değişir.

Diyelim ki, sınıf A, birden fazla uygulamaya sahip olan B sınıfını kullanıyor. Yani bu durumda B, çalışma zamanında sağlanan gerçek uygulama ile soyut olacaktır. Bu strateji modelidir

Şimdi eğer A'nın kendisi soyutsa. Hem A hem de B değişebilir. Köprü desenini kullanırsınız.


0

Bence kullanıldıkları bağlamda aralarında küçük bir fark var.

Köprü modelini, her ikisinin de daha büyük bir tanesine ait olduğu ortogonal kavramları ayırmak için kullanıyorum - bağımsız olarak değişmelerine izin vermek için. Genellikle birden fazla soyutlamayı içerir.

IMO, Strateji modeli daha basit veya daha düz. Kesinlikle OCP'ye hizmet eder, ancak Köprü modeli gibi başka ve daha büyük bir konseptin parçası olması gerekmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.