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

+ Recent posts