Strategy Pattern
- 각 객체가 할 수 있는 행위에 대한 클래스 생성
- 클래스들을 포괄하는 인터페이스 (추상 클래스) 생성
- 전략만 수정해줌으로써 행위를 유연하게 확장할 수 있음
성을 지키는 문지기 vs 동물
- 문지기 : 동물들을 쫓아내는 행위(책임)
public class Doorman {
public void getOut() {}
}
- 동물 : 쥐, 호랑이, 고양이
public class Mouse {
private String name = "쥐";
public String getName {return name;}
}
public class Tiger {
private String name = "호랑이";
public String getName {return name;}
}
public class Cat {
private String name = "고양이";
public String getName {return name;}
}
Q1. 문지기가 쥐를 쫓아내려면?
- 쫓아내는 메서드의 대상에 쥐를 추가
public class Doorman {
public void getOut(Mouse m) {
System.out.println(m.getName() + " 나가!");
}
}
public class App {
public static void main(String[] args) {
Mouse m1 = new Mouse();
Doorman d1 = new Doorman();
d1.쫓아내(m1);
}
}
Q2. 문지기가 호랑이도 쫓아내려면?
- 문지기는 현재 쥐만 쫓아낼 수 있음 : 두 가지 방법이 존재
- 메서드 오버로딩 : 메서드에 책임(호랑이)을 추가 (매개변수만 바꾸어 추가로 사용 가능)
- 추가할 책임의 수량이 한정적일 때만 사용 가능, 추적이 어려움
public class Doorman {
public void getOut(Mouse m) {
System.out.println(m.getName() + " 나가!");
}
public void getOut(Tiger t) {
System.out.println(t.getName() + " 나가!");
}
// ... 개수가 많아지면 계속 추가해야 함 (추적이 어려움)
}
- 책임이 추상 메서드를 상속받기만 하면 코드를 더 수정할 필요가 없음 : DIP 원칙
abstract class Animal {
abstract String getName();
}
public class Doorman {
public void getOut(Animal animal) {
System.out.println(animal.getName() + " 나가!");
}
}
A : 코드 자체는 똑같으나, 전략 패턴을 사용하면 관리가 훨씬 유용해짐.
public class App {
public static void main(String[] args) {
Mouse m1 = new Mouse();
Doorman d1 = new Doorman();
d1.쫓아내(m1);
Tiger t1 = new Tiger();
d1.쫓아내(t1);
}
}
Q3. 문지기가 고양이도 쫓아내려면?
- 전략 패턴을 사용하면, 문지기는 할 것이 없음 (코드 수정 X)
- 고양이가 동물을 상속받기만 하면 됨
- OCP 원칙 충족
public class Cat extends Animal {
private String name = "고양이";
public String getName() {return name;} // 상태 확인 (변경 X)
}
public class App {
public static void main(String[] args) {
Mouse m1 = new Mouse();
Doorman d1 = new Doorman();
d1.쫓아내(m1);
Tiger t1 = new Tiger();
d1.쫓아내(t1);
Cat c1 = new Cat();
d1.쫓아내(c1);
}
}
Strategy Pattern의 장점
- SOLID 원칙의 O(OCP), D(DIP)가 충족됨
- OCP (Open-Closed Principle) = 수정할 코드만 수정하고, 기존 코드는 건드리지 않음
- DIP (Dependency Inversion Principle) = 추상적인 개념에 의존함
- Doorman이 getOut의 책임만 가질 경우, SRP도 충족 가능
- SRP (Single Responblility Principle) = 하나의 객체는 하나의 책임만 가져야 함

Share article