[디자인 패턴] Strategy 패턴

이멀젼씨

·

2020. 1. 14. 22:13

- 정의

 

여러 전략들에 대한 하나의 인터페이스를 만들어 각 접근점에서 서로 교환이 가능하도록 하는 패턴이다.

 

간단하게 설명하자면, 인터페이스를 정의한 뒤 인터페이스를 따르는 여러 전략을 생성하고 필요시에 원하는 전략을 주입을 가능하게 함으로써 의도한 기능을 할 수 있게 해준다.

 

- UML

 

1. 특정 기능(여기선 study)를 수행할 인터페이스 정의

2. 각 특정한 기능을 전략에 맞게 수행할 클래스 정의(CafeStudyStrategy, LibraryStudyStrategy, HomeStudyStrategy)

3. 전략들에 맞는 기능을 수행해줄 클래스 정의(Stduy 클래스)

4. Study 객체에 전략을 설정하고 doStudy를 통해 해당 전략이 수행될 수 있도록 함

 

- 코드

 

StudyStrategy interface

public interface StudyStrategy {
	void study();
}

 

HomeStudyStrategy class (StudyStrategy 구현)

public class HomeStudyStrategy implements StudyStrategy {
	@Override
	public void study() {
		System.out.println("Study at Home");
	}
}

 

LibraryStudyStrategy class (StudyStrategy 구현)

public class LibraryStudyStrategy implements StudyStrategy {
	@Override
	public void study() {
		System.out.println("Study at library");
	}
}

 

 

CafeStudyStrategy class (StudyStrategy 구현)

public class CafeStudyStrategy implements StudyStrategy {
	@Override
	public void study() {
		System.out.println("Study at Cafe");
	}
}

 

Study class

public class Study {
	private StudyStrategy studyStrategy;
	
	public Study() {}
	
	public Study(StudyStrategy studyStrategy) {
		this.studyStrategy = studyStrategy;
	}
	
	public void setStrategy(StudyStrategy studyStrategy) {
		this.studyStrategy = studyStrategy;
	}
	
	public void doStudy() {
		studyStrategy.study();
	}
}

 

 

Main class

public class Main {
	 public static void main(String[] args) {
		 Study study = new Study();
		 
		 study.setStrategy(new HomeStudyStrategy());
		 study.doStudy();
		 
		 study.setStrategy(new CafeStudyStrategy());
		 study.doStudy();
		 
		 study.setStrategy(new LibraryStudyStrategy());
		 study.doStudy();
	}
}

 

- 설명

StudyStrategy 인터페이스를 만들고 study()라는 함수를 정의한다

 

HomeStudyStrategy, LibraryStudyStrategy,CafeStudyStrategy 클래스를 만들고 StudyStrategy 인터페이스의 study함수를 오버라이드한다

 

Study 클래스를 만들어 내부에 StudyStrategy 인터페이스 변수를 하나 만들어주고, set 메소드를 통해 전략을 설정할 수 있도록 한다

doStudy함수를 통해 설정된 전략이 실행되도록 한다

 

StrategyPattern 클래스에서 study 객체를 하나 생성하고, 필요로 하는 전략을 설정해주면

해당 전략에 따라 원하는 기능이 실행된다

 

 

만약 Strategy패턴 없이 새로운 환경 예를 들어, 집에서 공부하다가 카페에서 공부한다고 가정해보자.

 

if 분기문을 통해 처리해야 하며, 조건이 많아질수록 코드의 길이가 점점 증가하게 된다. 이 경우에는 SOLID 설계 원칙의 개방-폐쇄 원칙(OCP)에 위반하는 코드를 생성할 확률이 크다

 

Strategy 패턴은 Spring 프레임워크에서도 사용되며, 응집도를 낮게 만들어주어 코드의 유연성과 유지보수성을 높여준다