回答:
セマンティクス。ウィキペディアから:
StrategyパターンのUMLクラス図は、Bridgeパターンの図と同じです。ただし、これら2つの設計パターンの意図は同じではありません。Strategyパターンは動作を目的としていますが、Bridgeパターンは構造を目的としています。
コンテキストと戦略の間の結合は、抽象化とBridgeパターンの実装の間の結合よりも緊密です。
私が理解しているように、外部ソースから提供される可能性のある動作を抽象化している場合(たとえば、configがプラグインアセンブリをロードするように指定できる場合)にストラテジーパターンを使用しており、使用時にブリッジパターンを使用しているコードを少しすっきりさせる同じ構成要素。実際のコードは非常によく似ています- わずかに異なる理由でパターンを適用しているだけです。
ブリッジパターンは構造パターンです(ソフトウェアコンポーネントをどのように構築しますか?)。戦略パターンは動的パターンです(ソフトウェアで動作を実行する方法を教えてください)。
構文は似ていますが、目的は異なります。
戦略:
インテントは、実行時に動作を交換する機能です
class Context {
IStrategy strategyReference;
void strategicBehaviour() {
strategyReference.behave();
}
}
ブリッジ
目的は、抽象化を実装から完全に切り離すことです
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();
}
.............
}
私は同じことを考えていましたが、最近、ブリッジを使用する必要があり、ブリッジが戦略を使用し、コンテキストに抽象化を追加しているため、後でクライアントを変更せずにさらに変更を加えることができることに気付きました。抽象化せずに戦略を使用する場合、設計はそれほど柔軟ではなく、後でクライアントに変更を加える必要があるかもしれません。しかし、ブリッジ全体を使用すると、設計はさらに柔軟になります。ここでは、戦略からブリッジに移行することで、柔軟性がどのように向上するかを確認できます。また、「ビザ」と「マスター」はカードだけでなく、電話やチップでも利用できると想定しています。ブリッジを使用すると、サポートを追加するのがはるかに簡単になります。
ブリッジ:(構造パターン)
ブリッジパターンは、抽象化と実装を分離し、両方を独立して変更できるようにします。
このパターンは次の場合に使用します。
戦略:行動パターン)
戦略パターンを使用すると、実行時にアルゴリズムファミリーの複数のアルゴリズムを切り替えることができます。
戦略パターンは次の場合に使用します。
関連記事:
デザインパターンタイプ
橋(構造)
リモコンを取る。リモコンにはボタン1〜6があります。これは、上の図の具象クラスです。リモコンがテレビまたはDVDに使用されているかどうかに応じて、各ボタンの動作は異なります。各ボタンの機能は、実装者インターフェースによって実装から抽象化されています。
これにより、各デバイスのリモコンの動作を変更できます。
戦略(行動)
戦略では、リモートシナリオを見ていた場合。「状態」は、コンテキスト全体の状態参照を変更することで交換するリモート全体です。"concreteStateA"(TVリモート) "concreteStateB"(DVDリモート)。
追加の読み:
戦略パターンは行動の決定に使用され、ブリッジパターンは構造の決定に使用されます。
Brigdeパターンは実装の詳細から抽象的な要素を分離しますが、戦略パターンはアルゴリズムをより交換可能にすることを考慮しています。
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")
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()
Stereo
てTV
、コードだけで動作します。
戦略パターンに関するウィキから
StrategyパターンのUMLクラス図は、Bridgeパターンの図と同じです。ただし、これら2つの設計パターンの意図は同じではありません。Strategyパターンは動作を目的としていますが、Bridgeパターンは構造を目的としています。
コンテキストと戦略の間の結合は、抽象化とBridgeパターンの実装の間の結合よりも緊密です。