문제

나는 많은 기사를 읽으려고 노력했다 도 팩토리, Wikipedia 및 많은 사이트. 나는 브리지 패턴과 전략 패턴의 차이에 대해 전혀 모른다.

나는 둘 다 구현에서 추상화를 해체하고 실행 시간에 구현을 변경할 수 있다는 것을 알고 있습니다.

그러나 나는 여전히 어떤 상황에서 내가 전략을 사용해야하는지 또는 어떤 상황에서 내가 교량을 사용해야하는지 모른다.

도움이 되었습니까?

해결책

의미론. 에서 위키 백과:

전략 패턴에 대한 UML 클래스 다이어그램은 브리지 패턴의 다이어그램과 동일합니다. 그러나이 두 디자인 패턴은 의도에서 동일하지 않습니다. 전략 패턴은 행동을위한 것이지만 브리지 패턴은 구조를위한 것입니다.

컨텍스트와 전략 사이의 커플 링은 브리지 패턴의 추상화와 구현 사이의 커플 링보다 단단합니다.

내가 이해하는 것처럼, 외부 소스에서 제공 할 수있는 동작을 추상화 할 때 전략 패턴을 사용하고 있습니다 (예 : 일부 플러그인 어셈블리를로드하도록 지정할 수 있음). 코드를 약간 깔끔하게 만드는 것과 동일한 구성. 실제 코드는 매우 유사하게 보일 것입니다 - 당신은 단지 패턴을 적용하고 있습니다. 약간 다른 이유.

다른 팁

브리지 패턴은 구조적 패턴입니다 (소프트웨어 구성 요소를 어떻게 구축합니까?). 전략 패턴은 역동적 인 패턴입니다 (소프트웨어에서 동작을 어떻게 실행 하시겠습니까?).

구문은 비슷하지만 목표는 다릅니다.

  • 전략: 작업을 수행하는 더 많은 방법이 있습니다. 전략을 사용하면 런타임에 알고리즘을 선택할 수 있으며 컴파일 타임에 많은 부작용없이 단일 전략을 수정할 수 있습니다.
  • 다리: 인터페이스와 클래스의 계층 구조를 분할하고 추상 참조로 가입 할 수 있습니다 ( 설명)

전략:

  • 전략과 관련된 컨텍스트 : 컨텍스트 클래스 (아마도 추상적이지만 실제로 인터페이스가 아님! 전체 구현이 아닌 특정 동작을 캡슐화하고 싶기 때문에)는 전략 인터페이스 참조 및 구현 전략 행동을 불러 일으키기 위해.
  • 의도는 런타임에 동작을 바꾸는 능력입니다

    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. 추상화 및 구현은 컴파일 시간에 결정되지 않았습니다.
  2. 추상화와 구현은 독립적으로 변경되어야합니다
  3. 추상화 구현의 변경 사항은 발신자 응용 프로그램에 영향을 미치지 않아야합니다.
  4. 클라이언트는 구현 세부 사항에서 절연되어야합니다.

전략: (행동 패턴)

전략 패턴을 사용하면 런타임에 알고리즘 제품군에서 여러 알고리즘을 전환 할 수 있습니다.

다음과 같은 경우 전략 패턴을 사용합니다.

  1. 여러 버전의 알고리즘이 필요합니다
  2. 클래스의 동작은 런타임에 동적으로 변경되어야합니다.
  3. 조건부 진술을 피하십시오

관련 게시물:

브리지 패턴은 언제 사용합니까? 어댑터 패턴과 어떻게 다른가요?

전략 패턴의 실제 예

나는 똑같이 생각했지만 최근에는 Bridge를 사용해야했고 Bridge가 전략을 사용하고 컨텍스트에 추상화를 추가하여 나중에 고객을 변경하지 않고 더 많은 변경을 할 수 있음을 깨달았습니다. 추상화없이 전략을 사용할 때 설계는 유연하지 않으며 나중에 클라이언트를 변경해야 할 수 있습니다. 그러나 전체 브리지를 사용할 때 디자인이 더욱 유연 해집니다. 여기서 전략에서 브리지로가는 것이 더 많은 유연성을 제공하는 방법을 알 수 있습니다. 또한 우리는 이제 "비자"와 "마스터"가 카드뿐만 아니라 전화기와 칩에서도 사용할 수 있다고 가정합니다. 브리지를 사용하면 해당 지지대를 추가하는 것이 훨씬 쉽습니다.

Strategy VS Bridge

디자인 패턴 유형

  • 행동 적 : 패턴은 클래스 또는 객체가 상호 작용하고 책임을 분배하는 방식을 특징으로합니다.
  • 구조 : 패턴은 클래스 또는 객체의 구성을 다룹니다.
  • 창조물 : 패턴은 객체 생성 과정과 관련이 있습니다.

다리 (구조)

구현에서 추상화를 해체하여 각각이 다를 수 있습니다. 독립적으로. enter image description here

리모컨을 가져 가라. 리모컨에는 버튼 1-6이 있습니다. 이것은 위의 다이어그램의 구체적인 클래스입니다. 각 버튼은 리모컨이 TV 또는 DVD에 사용되는지에 따라 다르게 작동합니다. 각 버튼의 기능은 구현 자 인터페이스의 구현에서 추상화됩니다.

이를 통해 각 장치의 리모컨이 작동하는 방식을 변경할 수 있습니다.

전략 (행동)

알고리즘 패밀리를 정의하고 각각을 캡슐화하여 교환 가능하게 만듭니다. enter image description here

전략에서, 우리가 원격 시나리오를보고 있다면. "상태"는 컨텍스트의 상태 참조를 변경하여 교환하는 전체 리모컨입니다. "Concretestatea"(TV Remote) "Concretestateb"(DVD 리모컨).

추가 읽기 :

WillCodejavaforfood의 답변에 추가하면 구현에서 동일 할 수 있습니다. 그러나 전략을 사용하여 정렬 전략과 같은 전략을 바꾸는 반면 Bridge를 사용하여 두 개체의 데이터베이스 래퍼와 네트워크 어댑터를 연결하여 클라이언트 코드가 동일한 API에 대해 작동 할 수 있도록 네트워크 어댑터를 연결합니다. 따라서 이름 지정은 실제로 모든 것을 말합니다

  1. 전략 패턴은 행동 결정에 사용됩니다 다리 패턴은 구조적 결정에 사용됩니다.

  2. 브릭스 패턴은 구현 세부 사항에서 추상 요소를 분리하는 반면 전략 패턴은 알고리즘을보다 상호 교환 가능하게 만드는 것과 관련이 있습니다.

UML의 전략 패턴

UML의 Brigde 패턴

신속한 전략 패턴 :

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 패턴 :

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

위키에서 전략 무늬

전략 패턴에 대한 UML 클래스 다이어그램은 브리지 패턴의 다이어그램과 동일합니다. 그러나이 두 디자인 패턴은 의도에서 동일하지 않습니다. 전략 패턴은 행동을위한 것이지만 브리지 패턴은 구조를위한 것입니다.

컨텍스트와 전략 사이의 커플 링은 브리지 패턴의 추상화와 구현 사이의 커플 링보다 단단합니다.

패턴 비교 (의도 차이, ...)에 대해 이미 언급 된 내용을 추가하기 위해 : 브리지 패턴은 또한 추상화 계층 구조 측면이 Vary를 할 수 있도록 의도적으로 구성됩니다. C#과 같은 언어에서는 기존 소비자에게 문제를 일으키지 않는 의도 된 변형을 허용하는 방법으로 가상 방법을 포함하는 추상화 기반이 있음을 의미 할 수 있습니다. 그 외에는 두 패턴이 대부분 동일하게 보일 수 있습니다.

전략 패턴은 실행 시간에 알고리즘이나 전략을 연결하려는 경우 사용됩니다. 패턴의 범주는 또한 객체의 동작을 다룬다는 것을 암시합니다. 반면에 브리지는 구조적 패턴이며 물체의 구조적 계층 구조를 다룹니다. 그것은 그들 사이에 세련된 추상화를 도입하여 구현에서 추상화를 분리시킵니다. 정제 된 추상화는 (전략 패턴) 플러그 된 런타임 전략과 혼동 될 수 있습니다. 브리지 패턴은 N 수의 클래스를 생성하지 않는 메커니즘을 제공함으로써 구조적 측면을 다룹니다.

전략 패턴의 경우 구현 만 다릅니다.

클래스 A는 여러 구현을 사용할 수있는 클래스 B를 사용하고 있다고 가정합니다. 따라서이 경우 B는 런타임에 제공된 실제 구현으로 추상적입니다. 이것은 전략 패턴입니다

이제 그 자체가 추상적이라면. A와 B는 모두 다를 수 있습니다. 당신은 브리지 패턴을 사용합니다.

나는 그들이 사용하는 맥락에서 그들 사이에 약간의 차이가 있다고 생각합니다.

나는 브리지 패턴을 사용하여 둘 다 더 큰 개념에 속하는 직교 개념을 분리하여 독립적으로 변할 수 있도록합니다. 일반적으로 여러 가지 추상화가 포함됩니다.

IMO, 전략 패턴은 더 단순하거나 평평합니다. 그것은 확실히 OCP에 역할을하지만 반드시 브리지 패턴과 같은 다른 개념의 일부가 될 필요는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top