[Java] Design Pattern - Strategy
객체들이 할 수 있는
행위 각각에 대해 전략 클래스를 생성
하고유사한 행위들을 캡슐화 하는 인터페이스를 정의
하여,
객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장
하는 방법을 말한다.즉, 프로그램 실행중 모드가 바뀔때마다 알맞는 검색이 이루어지는 전략이라고 생각하면 된다.
프로젝트 전체에서 변경이 일어나지 않는 부분에서 변경이 일어나는 부분을 찾아서 따로 캡슐화 한다.
코드의 구성 방식은 다음과 같다.
예를 들어 동물에 대한 예시를 들어서 설명해보겠다.
모든 동물은 움직인다 하지만 각각 움직이는 환경 장소가 다르다. 새는 날고 물고기는 헤엄치고 강아지는 걷는다.
이렇게 공통적으로 움직인다는 행위가 있다. 그럼 이 움직임은 interface로 구현해준다. (동물의 움직임을 전략화한다.)
그리고 각 행위에 대해서 클래스로 나눠서 move에 대한 내용을 구현해준다.
interface MovingStrategy {
void move();
}
class Fly implements MovingStrategy {
@Override
public void move() {
System.out.println("날다");
}
}
class Walk implements MovingStrategy {
@Override
public void move() {
System.out.println("걷다");
}
}
class Swim implements MovingStrategy {
@Override
public void move() {
System.out.println("날다");
}
}
다음은 이동 즉, 움직임에 대한 클래스를 정의할 수 있다.
모든 동물은 move()라는 메서드로 인해 움직일 수 있다.
움직임을 직접 메서드로 구현하지 않고 어떻게 움직일 것인지에 대한 전략을 설정한다.
전략을 설정하는 메서드를 움직임 클래스에서 하나 정의한다.
public class Move {
private MovingStrategy movingStrategy;
// 어떤 움직임을 할것인지에 대한 전략 설정 메서드
public void setMovingStrategy(MovingStrategy movingStrategy) {
this.movingStrategy = movingStrategy;
}
public void moveMove() {
movingStrategy.move();
}
}
이제 마지막 단계이다.
각 동물들에 대한 객체를 생성하고 어떻게 움직일 것인지에 대해 정하여 setMovingStrategy() 메서드에 매개변수를 담고 호출하면된다.
그리고 프로그램상 동물의 움직임이 변경되었을때 유연하게 수정 할 수 있다.
예) 비둘기는 원래 하늘을 날아다녔는데 먹이를 많이 먹어서 이젠 걸어다니는 동물이 되었다.
public class Main {
public static void main(String[] args) {
Move dog = new Move();
dog.setMovingStrategy(new Walk);
dog.moveMove(); // 걷다.
Move pigeon = new Move();
pigeon.setMovingStrategy(new Fly);
pigeon.moveMove(); // 날다.
pigeon.setMovingStrategy(new Walk);
pigeon.moveMove(); // 걷다.
}
}
전략 패턴 특징
-
코드 중복 방지
-
런타임시에 타겟 메서드 변경
-
확장성(신규 클래스) 및 알고리즘 변경 용이
Author And Source
이 문제에 관하여([Java] Design Pattern - Strategy), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@conficker77/Java-Design-Pattern-Strategy저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)