1. 전략 패턴이란?
- 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴
- 특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화
2. 전략 패턴의 예시
아이폰은 애플스토어, 갤럭시는 구글플레이스토어(줄여서 플레이스토어)를 사용한다.
이를 이용해 간단한 예시를 만들어 보았다.
1) 전략 패턴을 적용하지 않은 경우
스토어 인터페이스
public interface Store {
public void store();
}
아이폰 클래스
public class IPhone implements Store {
public void store() {
System.out.println("Appstore On");
}
}
갤럭시 클래스
public class Galaxy implements Store {
public void store() {
System.out.println("PlayStore On");
}
}
메인 클래스
public class Main {
public static void main(String[] args) {
Store iPhone = new IPhone();
Store galaxy = new Galaxy();
iPhone.store();
galaxy.store();
}
}
// 출력
// AppStore On
// PlayStore On
만약 애플에서 삼성을 인수하여, 이제 갤럭시에서도 애플스토어를 쓴다고 가정하자. 그렇게 되면 Galaxy의 store() 메서드를
System.out.println("AppStore On");
로 바꿔주면 되지만, 이는 개방 폐쇄의 원칙에 어긋나며, 확장이 될 경우 유지보수를 어렵게 한다. 따라서 이럴 경우 전략 패턴을 적용하면 문제를 해결할 수 있다.
2. 전략 패턴을 적용한 경우
스토어를 이용하는 두 가지 경우를 클래스로 생성하며, store()를 이용하여 어떤 스토어를 이용하는지 구현한다.
스토어 인터페이스
public interface Store {
public void store();
}
앱스토어 클래스
public class AppStore implements Store {
public void store() {
System.out.println("AppStore On");
}
}
플레이스토어 클래스
public class PlayStore implements Store {
public void store() {
System.out.println("PlayStore On");
}
}
myStore 클래스
public class MyStore {
private Store myStore;
public void store() {
myStore.store();
}
public void setStore(Store myStore) {
this.myStore = myStore;
}
}
IPhone, Galaxy 클래스
public class IPhone extends MyStore {
}
public class Galaxy extends MyStore {
}
이제 IPhone에서는 앱스토어를, Galaxy에서는 플레이스토어를 이용할 수 있도록 구현한다.
Main 클래스
public class Main {
public static void main(String[] args) {
MyStore iPhone = new IPhone();
MyStore galaxy = new Galaxy();
iPhone.setStore(new AppStore());
galaxy.setStore(new PlayStore());
iPhone.store();
galaxy.store();
}
}
아까 상황과 같이 애플이 삼성을 인수하여 갤럭시에서 앱스토어를 사용한다고 가정하면, setStore 메서드를 이용하여 수정하기만 하면 된다.
galaxy.setStore(new AppStore());
galaxy.store();
'디자인 패턴 > 행위 패턴' 카테고리의 다른 글
옵저버 패턴 (Observer Pattern) (0) | 2021.08.29 |
---|