2016-07-27 2 views
2

나는 전략 패턴을 grok 수하려고 다음과 같은 예를 내놓았다 해요 :Strategy 패턴을 사용하여 순환 종속성을 제거하는 방법은 무엇입니까?

  • 내가 다른 이동 조각을 제외하고 체스를 기반으로 새로운 게임을 만들고 싶습니다.
  • 전략 패턴을 사용하여 동작을 삽입하는 방법도 있습니다.

그러나 우리는 Board, PieceMoveBehavior 객체

  • Board이있는 경우 - 조각이 Board로 전달해야하기 때문에>Board - BoardPiece
  • Piece가 포함되어 있기 때문에>Piece을 매개 변수를
    • MoveBehaviorBoard은 어떤 움직임이 수용 가능한지 결정합니다.
  • 가 어떻게 우리가이 순환 종속성 제거 할 수

? 또한 행동이 결정을 내리기에 충분히 큰 상태를 필요로하기 때문에보다 현실적인 예에서 공통적 인 문제는 아닌가? 행동이 매우 단순하다면 전략 패턴을 사용하지 않는 것이 그리 큰 문제가 아닐 것입니다.

답변

1

Board ->Piece ->MoveBehaviour을 사용하고 싶습니다.

보드에 조각이 들어 있고 조각의 유형에 따라 자체 동작이 있기 때문입니다.

public Move[] Moves 
{ 
    get 
    { 
     return new Move[] { Move.Horizontal, Move.Vertical }; 
    } 
} 

MoveBehaviour의 작업이 Piece이 곳은 요청에 이동할 수 있는지없는

MoveBehaviour

이 허용 움직임, 즉 조각을 말한다 (즉 내가 익숙 무엇 때문에 예는 C#을) 그것이 보드입니다.

는 기본적으로 뭔가 뭔가의 책임을 떠날 ...

public class Board 
{ 
    public List<Piece> Pieces { get; set; } 

    public bool CanMoveTo(Piece piece, Point location) { /*...*/ } 
} 

public class Piece : IMoveBehaviour 
{ 
    public Move[] Moves { get; set; } 
} 

public interface IMoveBehaviour 
{ 
    Move[] moves { get; set; } 
} 

그리고 IsValidMoveBoard의 방법과 RequestMove 같은 Piece, Move과 :

더 쉽게 C 아래 # 예 설명 그것을 움직이지 마라. MoveBehaviourBoard의 책임 인 이동의 유효성 검사가 아닌 Piece의 동작입니다.

3

모든 오브젝트 인스턴스를 해결하기 위해 의존성 삽입 프레임 워크를 사용할 수있는 것처럼 들립니다. 다양한 유형의 조합을 사용하여 인스턴스화하려는 경우 구성 가능한 컨테이너가 필요합니다. 구성 가능한 컨테이너를 전략으로 호출 할 수 있습니다 (재생되는 모든 조각을 선택 함).

나는 모든 조각과 행동을 만드는 책임을 맡지 않고, (의존성 주입을 사용하는) 작곡가 클래스를 사용한다.

이 기능을 사용하면 보드에 대한 동작을 사용하거나 다른 보드 유형을 만들 수 있습니다.

종속성 주입이 느슨한 결합을 얻는 방법에 대한 배경은 this question and answer을 참조하십시오.

관련 문제