재훈재훈
OODP - Strategy Pattern 본문
Strategy Pattern (스트래티지 패턴)
알고리즘 군을 정의하고 각각을 캡슐화하고 교환해서 사용할 수 있도록 만든다.
스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
어떤 객체를 만들 때 객체가 가지는 기능들이 다양하게 존재할 것이다.
이러한 기능들을 추상화(부품화)하여 언제든지 적용할 수 있게 구조를 만드는 것이 Strategy 패턴이다.
부품화된 기능들은 서로 교체가 가능하다.
예를 들어서 자동차에 들어가는 기어 모델이 3개가 있으면 옵션에 따라 기어 교체가 가능하다.
예제) 로봇 제조 프로그램
시나리오
1.로봇 모양은 팔, 다리, 머리, 몸통으로 이루어져 있습니다.
2.모든 로봇은 기본적으로 걷고, 달릴 수 있어야 합니다.
3.Super로봇은 날수 있고, 미사일을 쏠 수 있으며, 레이저 검을 가지고 있습니다.
4.Standard 로봇은 날수는 없지만 미사일을 쏠 수 있습니다. 그리고 레이저 검은 없지만, 목검은 가지고 있습니다.
5.Low 로봇은 날수도 없고, 미사일을 쏠 수도 없습니다. 그리고 레이저검 또는 목검도 없습니다.
살펴볼 코드
Robot - StandardRobot
FireAction(interface) - FireNo or FireYes
public abstract class Robot { // Robot 추상클래스
public FireAction fireAction; // FireAction 인터페이스 타입 변수 fireAction을 선언
......
public Robot() {}
......
public abstract void shape();
public void actionFire() { // fireAction.fire() - 부품화할 대상. 추후에 편리하게 교체 가능
fireAction.fire();
}
......
}
public class StandardRobot extends Robot { // Robot 추상클래스를 상속받은 StandardRobot 클래스
public StandardRobot() {
fireAction = new FireOk(); // fireAction에 FireOk를 지정해줌
// FireOk는 FireAction 인터페이스를 구현한 하위클래스 (다형성!!)
//fireAction = new FireNo(); - FireNo()를 해줄 수도 있다! 이것이 바로 부품화!
......
}
......
public void shape() { // 추상메서드를 구현
System.out.println("팔, 다리, 머리, 몸통으로 이루어져 있다. 걷고, 달릴 수 있다.");
}
}
public interface FireAction { // FireAction 인터페이스
public void fire();
}
public class FireNo implements FireAction { // FireNo 클래스 (FireAction을 구현함)
public void fire() {
System.out.println("미사일 발사 기능 없습니다.");
}
}
public class FireOk implements FireAction { // FireYes 클래스 (FireAction을 구현함)
public void fire() {
System.out.println("미사일 발사");
}
}
----------------------------------------------------------------------------------------------------------------------
Main
System.out.println("StandardRobot이 주문 들어 왔어요. 만들어 주세요.");
Robot standardRobot = new StandardRobot();
standardRobot.shape();
standardRobot.actionFire(); // actionFire가 어떤 객체를 불러오느냐에 따라 결과가 달라짐!
이런 식으로 코드가 진행된다.
FireAction은 부품화(기능화)되어서 로봇을 만들 때마다 기능을 교체해서 집어넣을 수 있게 된다.
'Computer Engineering > JAVA' 카테고리의 다른 글
Java I/O (0) | 2018.04.07 |
---|---|
Java Collections (0) | 2018.04.07 |
OODP - Singleton Pattern (0) | 2018.04.07 |
제네릭(Generic) (0) | 2018.04.07 |
파라미터의 다형성 (0) | 2018.04.07 |