JavaRush /Java Blog /Random-KO /Java의 상태 패턴과 전략 패턴의 차이점
0xFF
레벨 9
Донецк

Java의 상태 패턴과 전략 패턴의 차이점

Random-KO 그룹에 게시되었습니다
핵심 Java 애플리케이션에서 상태전략 패턴을 적절하게 사용하려면 Java 프로그래머가 이들 패턴의 차이점을 명확하게 이해하는 것이 중요합니다. 두 패턴, 즉 State와 Strategy는 유사한 구조를 갖고 있으며 둘 다 개방형/폐쇄형 원칙을 기반으로 하며 SOLID 원칙 의 "O"를 표시하지만 의도 는 완전히 다릅니다 . Java의 전략Java의 상태 패턴과 전략 패턴의 차이점 - 1 패턴은 관련 알고리즘 세트를 캡슐화하여 클라이언트에 실행 유연성을 제공하는 데 사용됩니다 . 클라이언트는 . 전략 패턴 의 인기 있는 예로는 암호화, 압축 또는 정렬과 같은 알고리즘을 사용하는 코드 작성이 있습니다. 반면에 상태 패턴을 사용하면 객체가 상태에 따라 다르게 동작할 수 있습니다. 현실 세계에서 객체는 종종 상태를 가지며 상태에 따라 다르게 동작합니다. 예를 들어 자동 판매기는 해당 상태에 있는 경우에만 상품을 판매하고 동전을 넣기 전까지는 판매하지 않습니다. 이제 전략 패턴과 상태 패턴의 차이점을 명확하게 볼 수 있습니다. 이는 서로 다른 의도입니다. 상태 패턴은 객체가 상태를 관리하는 데 도움이 되는 반면, 전략 패턴은 클라이언트가 다른 동작을 선택할 수 있도록 해줍니다. 확인하기 쉽지 않은 또 다른 차이점은 누가 행동 변화를 주도하는지입니다. Strategy 패턴의 경우 context에 다양한 전략을 제공하는 클라이언트이고, State 패턴의 경우 context나 객체 자체의 상태에 따라 전환이 제어됩니다. 또한 State 개체의 상태 변경을 직접 관리하는 경우 컨텍스트에 대한 참조가 있어야 합니다. 예를 들어 자동 판매기는 컨텍스트의 현재 상태를 변경하는 메서드를 호출할 수 있어야 합니다. 반면에 Strategy 객체는 컨텍스트에 대한 참조를 포함하지 않으며 클라이언트 자체가 선택한 Strategy를 컨텍스트에 전달합니다. 상태 패턴과 전략 패턴의 차이점은 Java 패턴에 대한 인기 있는 인터뷰 질문 중 하나입니다 . Java 패턴에 대한 이 기사에서는 이에 대해 자세히 살펴보겠습니다. Java의 전략 패턴과 상태 패턴 간의 몇 가지 유사점과 차이점을 살펴보고 이러한 패턴에 대한 이해를 높이는 데 도움이 될 것입니다. StrategyhasCoinsetState()

상태 패턴과 전략 패턴의 유사점

상태 및 전략 패턴의 UML 다이어그램을 보면 둘 다 서로 유사해 보인다는 것을 알 수 있습니다. 상태를 사용하여 동작을 변경하는 개체를 -object라고 하며 , 마찬가지로 Strategy를 사용하여 동작을 변경하는 개체를 -object Context라고 합니다 . Context클라이언트는 Context-object와 상호작용한다는 점을 기억하세요. State 패턴의 경우 컨텍스트는 호출 메서드를 현재 객체로 보유하고 있는 State 객체에 위임하고, Strategy 패턴의 경우 컨텍스트는 Strategy 객체를 매개변수로 사용하거나 생성 시 제공됩니다. 객체의 컨텍스트. Java의 상태 패턴에 대한 UML 다이어그램 상태 패턴에 대한 Java의 상태 패턴과 전략 패턴의 차이점 - 2 이 UML 다이어그램은 Java에서 객체 지향 자동 판매기 디자인을 생성하는 고전적인 문제를 묘사합니다. 자판기의 상태는 인터페이스를 사용하여 표현되고, 인터페이스에는 특정 상태를 표현하는 구현이 포함되어 있음을 알 수 있습니다. 또한 각 상태에는 개체 컨텍스트에 대한 참조가 있어 컨텍스트에서 호출된 작업의 결과로 다른 상태로 전환됩니다. Java의 전략 패턴에 대한 UML 다이어그램 전략 Java의 상태 패턴과 전략 패턴의 차이점 - 3 패턴에 대한 이 UML 다이어그램에는 일종의 기능적 구현이 포함되어 있습니다. 많은 정렬 알고리즘이 있으므로 이 디자인 패턴을 사용하면 클라이언트가 개체를 정렬할 때 알고리즘을 선택할 수 있습니다. 실제로 Java 컬렉션 프레임워크는Collections.sort() 이 패턴을 사용하여 Java에서 개체를 정렬하는 데 사용되는 메서드를 구현합니다 . 유일한 차이점은 클라이언트가 정렬 알고리즘을 선택하도록 허용하는 대신 Comparator 또는 Comparable 인터페이스의 인스턴스를 Java에 전달하여 비교 전략을 지정할 수 있다는 것입니다 . Java의 두 가지 주요 디자인 패턴 사이의 몇 가지 유사점을 살펴보겠습니다.
  1. 상태와 전략 패턴 모두 이를 사용하는 개체의 컨텍스트에 영향을 주지 않고 새로운 상태와 전략을 쉽게 추가할 수 있게 해줍니다.

  2. 둘 다 개방형/폐쇄형 원칙 에 따라 코드를 유지 관리합니다 . 즉, 디자인은 확장에는 개방되지만 수정에는 폐쇄됩니다. 상태 및 전략 패턴의 경우 개체의 컨텍스트는 수정, 새 상태 또는 새 전략 도입에 대해 닫혀 있거나 다른 상태의 컨텍스트를 수정할 필요가 없거나 최소한의 변경이 필요합니다.

  3. 객체 컨텍스트가 State 패턴에서 객체의 초기화 상태로 시작하는 것처럼 Java의 Strategy 패턴의 경우 객체 컨텍스트에도 기본 전략이 있습니다.

  4. 상태 패턴은 다양한 개체 상태의 형태로 다양한 동작을 나타내고, 전략 패턴은 다양한 개체 전략의 형태로 다양한 동작을 나타냅니다.

  5. 전략과 상태 패턴 모두 동작 구현의 하위 클래스에 따라 달라집니다. 각각의 구체적인 전략은 추상 전략을 확장하며, 각 상태는 상태를 나타내는 데 사용되는 인터페이스 또는 추상 클래스의 하위 클래스입니다.

Java의 전략 패턴과 상태 패턴의 차이점

이제 우리는 상태 패턴과 전략 패턴이 구조적으로 유사하지만 의도가 다르다는 것을 알고 있습니다. 이러한 디자인 패턴 간의 몇 가지 주요 차이점을 살펴보겠습니다.
  1. 전략 패턴은 관련 알고리즘 세트를 캡슐화하고 클라이언트가 런타임 시 구성 및 위임에도 불구하고 상호 교환 가능한 동작을 사용할 수 있도록 하는 반면, 상태 패턴은 클래스가 다양한 상태에서 다양한 동작을 나타내는 데 도움이 됩니다.

  2. State와 Strategy 패턴의 다음 차이점은 State는 객체의 상태를 캡슐화하는 반면 Strategy 패턴은 알고리즘이나 전략을 캡슐화한다는 것입니다. 상태는 객체와 연결되어 있기 때문에 재사용할 수 없지만 전략이나 알고리즘을 해당 컨텍스트에서 분리하면 재사용할 수 있습니다.

  3. 상태 패턴에서 개인 상태에는 상태 간 전환을 구현하기 위한 컨텍스트에 대한 참조가 포함될 수 있지만 전략에는 사용되는 컨텍스트에 대한 참조가 포함되어 있지 않습니다.

  4. 전략의 구현은 이를 사용할 객체에 매개변수로 전달될 수 있습니다. 예를 들어 Collection.sort()는 전략인 비교기를 사용합니다. 반면에 상태는 객체 컨텍스트 자체의 일부이며 시간이 지남에 따라 객체의 컨텍스트가 한 상태에서 다른 상태로 전환됩니다.

  5. 전략과 상태는 모두 개방형/폐쇄형 원칙을 따르지만 각 전략에는 개별 알고리즘이 포함되어 있으므로 전략도 단일 책임 원칙을 따릅니다. 서로 다른 전략은 서로 독립적입니다. 하나의 전략을 변경한다고 해서 다른 전략을 변경할 필요는 없습니다.

  6. Strategy 패턴과 State 패턴의 또 다른 이론적인 차이점은 작성자가 객체의 "How" 부분을 정의한다는 것입니다(예: 정렬 객체가 데이터를 정렬하는 "How"). 반면 State 패턴은 "what"과 "when"을 정의합니다. 객체의 일부(예: 객체가 특정 상태에 있을 때 수행할 수 있는 작업)

  7. 상태 전환 순서는 상태 패턴에 잘 정의되어 있지만 전략 패턴에는 그러한 요구 사항이 없습니다. 고객은 자신이 선택한 전략의 구현을 자유롭게 선택할 수 있습니다.

  8. 전략 패턴의 일반적인 예 중 일부는 정렬 알고리즘, 암호화 알고리즘 또는 압축 알고리즘과 같은 알고리즘의 캡슐화입니다. 코드에서 다양한 종류의 관련 알고리즘을 사용해야 하는 경우 전략 패턴 사용을 고려해야 합니다. 반면에 상태 패턴의 사용을 인식하는 것은 매우 쉽습니다. 중첩된 조건문을 많이 사용하지 않고 상태 및 상태 전환을 관리해야 하는 경우 상태 패턴을 사용하는 것이 올바른 패턴입니다.

  9. 마지막이지만 상태 패턴과 전략 패턴 간의 가장 중요한 차이점 중 하나는 전략에 대한 변경은 클라이언트에 의해 수행되는 반면 상태에 대한 변경은 컨텍스트 또는 객체의 상태 자체에 의해 수행될 수 있다는 것입니다.

이것은 Java의 상태 패턴과 전략 패턴의 차이점에 관한 것입니다 . 내가 말했듯이 둘 다 클래스와 UML 다이어그램에서 유사해 보이며 둘 다 개방형/폐쇄적 원칙을 제공하고 동작을 캡슐화합니다. 전략 패턴을 사용하여 런타임 시 컨텍스트에 노출되는 알고리즘 또는 전략을 매개변수 또는 복합 객체로 캡슐화하고 상태 패턴을 사용하여 Java에서 상태 전환을 제어합니다. 원본은 여기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION