-
[디자인 패턴] 전략 패턴 Strategy Pattern디자인 패턴 2022. 1. 8. 19:47반응형
이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.
틀리거나 잘못된 정보가 있을 수 있습니다.
댓글로 알려주시면 수정하도록 하겠습니다.
1. 전략 패턴이란
객체의 여러 작업들 중 변하는 부분과 유사한 부분을 2개의 오브젝트로 분리하여 유사한 부분을 클래스로 만들고 변하는 부분을 인터페이스로 만들어 변하는 부분을 인터페이스를 통해서 의존하도록 만드는 전략 패턴입니다.
즉 객체의 작업이 동적으로 변할 때 고정된 부분인 클래스에서 전략 인터페이스를 호출 함으로써 해당 전략만 수정하면 객체의 작업을 동적으로 변경할 수 있도록 하는 패턴입니다.
2. 전략 패턴 UML
클라이언트는 사용할 전략을 선택하여 해당 객체를 생성하고 생성된 전략을 컨텍스트에 전달합니다.
이후 클라이언트가 컨텍스트의 메소드를 이용하면 컨텍스트는 고정된 작업을 수행하고 전략을 호출하여 전략에 맞는 변하는 부분을 수행하여 결과를 컨텍스트로 전달하고 컨텍스트는 최종 결과를 클라이언트로 전달합니다.
3. 구현 예제
게임 이용자가 있으며 이용자는 총 10번의 게임을 진행하여 룰에 따라 점수를 받을 수 있습니다.
룰은 3의 배수가 나오면 얻은 점수의 2배를 점수로 얻는 게임입니다.
사용자 클래스입니다. 먼저 사용자는 전략을 가지고 있으며 점수들을 기록하는 배열을 가지고 있습니다.
생성자로 전략을 받을 수 있고 기본 생성자로 사용자를 생성하면 기본전략으로 전략을 가지게 됩니다.
이너 클래스 형태로 점수 클래스를 가지고 있으면 이 클래스는 점수를 받은 시간과 점수를 속성으로 가지고 있습니다.
이 사용자 클래스가 바로 컨텍스트가 됩니다.
사용자는 일반 점수를 얻는 것과 2배의 점수를 얻는 것에 따라 변하는 부분이 없습니다.
즉 점수를 얻으면 해당 점수를 기록하는 역할을 하기에 어떤 전략이 되어도 고정되는 것입니다.
전략 인터페이스입니다. GamePointStrategy는 점수를 얻는 전략을 결정하는 메소드만 필요하므로 해당 메소드만 정의하였습니다.
위 게임 포인트 전략을 구현한 PGamePoint의 Normal과 Jumbo입니다.
PGamePoint 클래스의 이너 클래스로 만든 이유는 추후 게임이 확장되어 또 다른 점수가 생길 수 있는 가능성에 대비하기 위해서 이너 클래스 형태로 만들었습니다.
클라이언트를 담당하는 테스트 메소드입니다.
테스트 메소드는 어떤 전략을 사용할지 Normal, Jumbo를 선택하고 해당 전략을 컨텍스트인 사용자에 전달함으로써 다른 변경 작업 없이 전략의 변경으로 게임 점수를 기록할 수 있습니다.
이번에는 게임에 K점수가 추가된 과정을 보겠습니다.
K점수는 게임의 골든 점수입니다. 게임에서 0이 나오면 100점을 얻을 수 있도록 만들어 보겠습니다.
K점수 클래스를 만들고 이너 클래스로 100점을 반환하는 전략을 구현합니다.
이후 클라이언트 역할을 담당하는 테스트 메소드에서 0점이 나온 경우 K점수 전략을 사용하도록 전략을 선택하고 생성하면 확장된 게임 룰 구현도 가능합니다.
이 처럼 전략 패턴은 실행 중에 전략을 선택할 수 있도록 하여 전략 수정만으로 변경이 되어야 하는 부분을 변경하여 로직을 수행할 수 있도록 하는 디자인 패턴입니다.
사용된 예제 코드는 Git에 있습니다.
반응형'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] Template Callback Pattern (템플릿 콜백 패턴) (0) 2022.01.03