전략 패턴

1 개요[ | ]

strategy pattern, policy pattern
strategy 패턴, 스트래티지 패턴, 전략 패턴, 정책 패턴
  • 알고리즘을 교체할 수 있는 구조
  • 동적으로 알고리즘을 교체할 수 있는 디자인 패턴
  • 알고리즘을 사용하는 곳과, 알고리즘을 제공하는 곳을 분리시킨 구조
  • 알고리즘 군을 정의하고, 각각 캡슐화하며, 교체가능하게 한다.
  • 알고리즘 인터페이스를 정의하고 각 알고리즘들을 클래스별로 캡슐화하여 교체 가능하게 한다.
  • 클라이언트가 사용할 때, 알고리즘을 독립적으로 변형시킬 수 있다.
  • 변경이 필요한 알고리즘을 인터페이스를 통해 외부로 분리, 구체적 알고리즘 클래스를 필요에 따라 바꿔 사용할 수 있게 한다.
  • 개방 폐쇄 원칙 실현에 가장 잘 맞는 패턴이다.
  • 인터페이스명은 흔히 FooStrategy 또는 FooBehavior와 같은 형식으로 한다.
  • 전략 패턴은 위임(delegation)을 통해 알고리즘 전체를 변경할 수 있는 반면, 템플릿 메소드 패턴상속(inheritance)을 통해 알고리즘 일부만 변형시킬 수 있다.

Strategy Pattern in UML.png

W3sDesign Strategy Design Pattern UML.jpg

2 사례[ | ]

  • 정렬 알고리즘 선택
  • 결제방법 선택

3 예제[ | ]

import java.util.ArrayList;
import java.util.List;

public class StrategyPatternWiki {

	public static void main(String[] args) {
		Customer a = new Customer(new NormalStrategy());

		// Normal billing
		a.add(1.0, 1);

		// Start Happy Hour
		a.setStrategy(new HappyHourStrategy());
		a.add(1.0, 2);

		// New Customer
		Customer b = new Customer(new HappyHourStrategy());
		b.add(0.8, 1);
		// The Customer pays
		a.printBill();

		// End Happy Hour
		b.setStrategy(new NormalStrategy());
		b.add(1.3, 2);
		b.add(2.5, 1);
		b.printBill();

	}
}

class Customer {

	private List<Double> drinks;
	private BillingStrategy strategy;

	public Customer(BillingStrategy strategy) {
		this.drinks = new ArrayList<Double>();
		this.strategy = strategy;
	}

	public void add(double price, int quantity) {
		drinks.add(strategy.getActPrice(price * quantity));
	}

	// Payment of bill
	public void printBill() {
		double sum = 0;
		for (Double i : drinks) {
			sum += i;
		}
		System.out.println("Total due: " + sum);
		drinks.clear();
	}

	// Set Strategy
	public void setStrategy(BillingStrategy strategy) {
		this.strategy = strategy;
	}

}

interface BillingStrategy {
	public double getActPrice(double rawPrice);
}

// Normal billing strategy (unchanged price)
class NormalStrategy implements BillingStrategy {

	@Override
	public double getActPrice(double rawPrice) {
		return rawPrice;
	}

}

// Strategy for Happy hour (50% discount)
class HappyHourStrategy implements BillingStrategy {

	@Override
	public double getActPrice(double rawPrice) {
		return rawPrice*0.5;
	}

}

4 같이 보기[ | ]

5 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}