[패턴] 전략 패턴(Strategy Pattern)

2015. 7. 6. 10:46·개념

 

전략 패턴, 스트래티지 패턴(Strategy Pattern)

전략 패턴에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.

알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

 

클래스안에서 동작하는 것들을 멤버함수로 설정하지 않고, 클래스로 별도로 생성하여 처리하는 것

 

* 알고리즘(메소드) 부분만 변경하여 하나의 클래스가 여러가지 행동을 할 수 있도록 설정하는 것

 

예제코드

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 {
	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;
	}

}

 

<JDK 8버전 - 람다식 >

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

public class StrategyPatternInJDK8 {

	static final Function<Double, Double> normal = (rawPrice) -> rawPrice;
	static final Function<Double, Double> happyHour = (rawPrice) -> rawPrice * 0.5;
	
	public static void main(String[] args) {
				
		Customer2 a = new Customer2(normal);
		// Normal billing
		a.add(1.0, 1);
		// Start Happy Hour
		a.setStrategy(happyHour);
		a.add(1.0, 2);
		
		a.printBill();
		
		
		// New Customer
		Customer2 b = new Customer2(happyHour);
		b.add(0.8, 1);
		// End Happy Hour
		b.setStrategy((rawPrice) -> rawPrice);
		b.add(1.3, 2);
		b.add(2.5, 1);
		
		b.printBill();
	}
}

class Customer2 {

	private List<Double> drinks;
	private Function<Double, Double> strategy;

	public Customer2(Function<Double, Double> strategy) {
		this.drinks = new ArrayList<Double>();
		this.strategy = strategy;
	}

	public void add(double price, int quantity) {
		drinks.add(strategy.apply(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(Function<Double, Double> strategy) {
		this.strategy = strategy;
	}
}

 

 

디자인 원칙

애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분을 분리시킨다.

바뀌는 부분만 뽑아서 캡슐화 한다.

 

 

참고

https://en.wikipedia.org/wiki/Strategy_pattern

https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html

 

 

 

 

반응형
저작자표시 비영리 (새창열림)

'개념' 카테고리의 다른 글

C10K 문제(C10K problem)  (0) 2016.01.22
[개념] REPL  (0) 2015.07.20
[개념] NPAPI  (0) 2015.07.01
[스크랩] GMT, UTC, KST  (0) 2015.06.18
[스크랩] 리눅스와 유닉스  (0) 2015.06.11
'개념' 카테고리의 다른 글
  • C10K 문제(C10K problem)
  • [개념] REPL
  • [개념] NPAPI
  • [스크랩] GMT, UTC, KST
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1140)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (418)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (16)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    AWS
    S3
    백준
    오류
    bash
    emr
    정올
    파이썬
    Linux
    HIVE
    다이나믹
    하이브
    Tez
    hbase
    java
    build
    Python
    nodejs
    Hadoop
    SPARK
    k8s
    oozie
    ubuntu
    HDFS
    mysql
    airflow
    알고리즘
    yarn
    하둡
    error
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
[패턴] 전략 패턴(Strategy Pattern)
상단으로

티스토리툴바