문제

어떻게 작동하고, 어디에 사용되며, 언제 사용해야 합니까?

도움이 되었습니까?

해결책

전략 패턴을 쉽게 설명해 보겠습니다.

수업이 있어요 Car() 방법으로 run(), 의사 언어에서는 다음과 같이 사용합니다.

mycar = new Car()
mycar.run()

이제 run() 프로그램이 실행되는 동안 즉석에서 동작합니다.예를 들어, 모터 고장이나 비디오 게임의 "부스트" 버튼 사용을 시뮬레이션할 수 있습니다.

이 시뮬레이션을 수행하는 방법에는 여러 가지가 있습니다.조건문과 플래그 변수를 사용하는 것도 한 가지 방법입니다.전략 패턴은 또 다른 것입니다:그것은 행동을 위임한다. run() 다른 클래스에 대한 메소드:

Class Car()
{
    this.motor = new Motor(this) 

    // passing "this" is important for the motor so it knows what it is running

    method run()
    {
        this.motor.run()
    }

    method changeMotor(motor)
    {
        this.motor = motor 
    }

}

자동차의 행동을 바꾸고 싶다면 모터만 바꾸면 됩니다.(실생활보다 프로그램이 더 쉽죠?;-) )

복잡한 상태가 많은 경우 매우 유용합니다.훨씬 더 쉽게 변경하고 유지할 수 있습니다.

다른 팁

문제

전략 패턴은 다른 방법으로 구현되거나 해결될 수 있는(또는 예상되는) 문제를 해결하는 데 사용됩니다. 전략 그러한 경우에 대해 명확하게 정의된 인터페이스를 보유합니다.각 전략은 그 자체로 완벽하게 유효하며 일부 전략은 런타임 중에 응용 프로그램이 전략 간에 전환할 수 있는 특정 상황에서 선호됩니다.

코드 예

namespace StrategyPatterns
{
  // Interface definition for a Sort algorithm
  public interface ISort
  {
    void Sort(List<string> list)
  }

  // QuickSort implementation
  public class CQuickSorter : ISort
  {
    void Sort(List<string> list)
    {
      // Here will be the actual implementation
    }
  }

  // BubbleSort implementation
  public class CBubbleSort : ISort
  {
    void Sort(List<string> list)
    {
      // The actual implementation of the sort
    }
  }

  // MergeSort implementation
  public class CMergeSort : ISort
  {
    void Sort(List<string> list)
    {
      // Again the real implementation comes here
    }
  }

  public class Context
  {
    private ISort sorter;

    public Context(ISort sorter)
    {
      // We pass to the context the strategy to use
      this.sorter = sorter;
    }

    public ISort Sorter
    {
      get{return sorter;)
    }
  }

  public class MainClass
  {
    static void Main()
    {
       List<string> myList = new List<string>();

       myList.Add("Hello world");
       myList.Add("Another item");
       myList.Add("Item item");

       Context cn = new Context(new CQuickSorter());
       // Sort using the QuickSort strategy
       cn.Sorter.Sort(myList);
       myList.Add("This one goes for the mergesort");
       cn = new Context(new CMergeSort());
       // Sort using the merge sort strategy
       cn.Sorter.Sort(myList);
    }
  }
}
  • 전략이란 무엇입니까?전략은 특정 목표를 달성하기 위해 고안된 행동 계획입니다.
  • “알고리즘 계열을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만듭니다.전략은 알고리즘을 사용하는 클라이언트와 독립적으로 다를 수 있습니다.” (갱 4 명);
  • 각각 잠재적인 동작을 나타내는 클래스 집합을 지정합니다.해당 클래스 간을 전환하면 애플리케이션 동작이 변경됩니다.(전략)
  • 이 동작은 런타임(다형성 사용) 또는 디자인 타임에 선택할 수 있습니다.
  • 인터페이스에서 추상화를 캡처하고 파생 클래스에 구현 세부 정보를 묻습니다.

enter image description here

  • 전략의 대안은 조건부 논리를 사용하여 애플리케이션 동작을 변경하는 것입니다.(나쁜);
  • 이 패턴을 사용하면 애플리케이션 전체 또는 일부를 다시 코딩하거나 다시 테스트할 필요 없이 특정 동작을 더 쉽게 추가하거나 제거할 수 있습니다.

  • 좋은 용도:

    • 유사한 알고리즘 세트가 있고 애플리케이션의 다른 부분에서 이들 사이를 전환해야 하는 경우.전략 패턴을 사용하면 ifs를 방지하고 유지 관리를 쉽게 할 수 있습니다.
    • 모든 하위 클래스에 반드시 의미가 있는 것은 아닌 새로운 메서드를 슈퍼클래스에 추가하고 싶을 때.전통적인 방식으로 인터페이스를 사용하는 대신 새 메소드를 추가하는 대신 새 기능 인터페이스의 하위 클래스인 인스턴스 변수를 사용합니다.이는 구성으로 알려져 있습니다.상속을 통해 능력을 상속받는 대신 클래스는 올바른 능력을 가진 개체로 구성됩니다.

밀접하게 관련된 패턴은 Delegate 패턴입니다.두 경우 모두 일부 작업이 다른 구성 요소로 전달됩니다.내가 올바르게 이해했다면 이러한 패턴의 차이점은 다음과 같습니다(틀렸다면 정정해 주세요).

  • 에서 대리자 패턴에서 대리자는 둘러싸는(위임) 클래스에 의해 인스턴스화됩니다.이를 통해 상속이 아닌 구성을 통해 코드를 재사용할 수 있습니다.바깥쪽 클래스는 대리자의 구체적인 유형을 인식할 수 있습니다.생성자 자체를 호출하는 경우(팩토리를 사용하는 것과 반대)

  • 에서 전략 패턴에서 전략을 실행하는 구성 요소는 종교에 따라 생성자 또는 설정자를 통해 둘러싸는(사용하는) 구성 요소에 제공되는 종속성입니다.사용 구성 요소는 어떤 전략이 사용 중인지 전혀 인식하지 못합니다.전략은 항상 인터페이스를 통해 호출됩니다.

다른 차이점 아시는 분 계신가요?

직접에서 전략 패턴 Wikipedia 기사:

전략 패턴은 애플리케이션에 사용되는 알고리즘을 동적으로 교체해야 하는 상황에 유용합니다.전략 패턴은 알고리즘 계열을 정의하고 각 알고리즘을 객체로 캡슐화하고 상호 교환 가능하게 만드는 수단을 제공하기 위한 것입니다.전략 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘이 달라질 수 있습니다.

이미 훌륭한 답변에 추가하려면 다음을 수행하십시오.전략 패턴은 함수(또는 함수)를 다른 함수에 전달하는 것과 매우 유사합니다.전략에서는 해당 함수를 객체로 래핑한 다음 객체를 전달하여 이를 수행합니다.일부 언어는 함수를 직접 전달할 수 있으므로 패턴이 전혀 필요하지 않습니다.하지만 다른 언어는 함수를 전달할 수 없지만 ~할 수 있다 객체 전달;그런 다음 패턴이 적용됩니다.

특히 Java와 유사한 언어에서는 언어의 유형 동물원이 매우 작으며 이를 확장하는 유일한 방법은 객체를 생성하는 것입니다.따라서 문제에 대한 대부분의 해결책은 패턴을 생각해내는 것입니다.특정 목표를 달성하기 위해 객체를 구성하는 방법입니다.유형이 풍부한 언어는 문제를 해결하는 더 간단한 방법을 갖는 경우가 많습니다. 하지만 유형이 풍부할수록 유형 시스템을 배우는 데 더 많은 시간을 투자해야 함을 의미합니다.동적 타이핑 규칙을 갖춘 언어는 종종 문제를 우회하는 방법을 얻습니다.

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