반응형
타진
개발 그라운드
타진
전체 방문자
오늘
어제
  • 분류 전체보기 (136)
    • 프로그래밍 (65)
      • Java (28)
      • Android (1)
      • Web (19)
      • Web-Spring (12)
      • R (5)
      • Angular (0)
    • 운영체제 (17)
      • Linux (14)
      • Docker(vmware) (3)
    • 클라우드 (4)
      • aws (0)
      • aws_handson (4)
    • 개발문제해결 (25)
      • Exception (12)
      • 알고리즘 문제풀이 (13)
    • 그 외 개발관련 (23)
    • 일상 (1)

블로그 메뉴

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

공지사항

인기 글

태그

  • 빠른 시작 끄기
  • cfn
  • ubuntu terminal
  • wsl_update_x64
  • 정올알고리즘 정올 알고리즘
  • handson
  • transit gateway peering
  • chromium edge
  • GIT
  • 라이젠
  • transit_gateway
  • docker
  • docker ps
  • AWS
  • jdk14
  • wsl2
  • 빠른 시작 켜기
  • Github CLI
  • angular cli
  • 일어키보드
  • 크로미움 엣지
  • github actions
  • vmmem
  • alt tab
  • docker desktop
  • stackset
  • 4700u
  • 문법 체크
  • 키보드매핑
  • github

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
타진

개발 그라운드

디자인 패턴 - 전략 패턴(Strategy pattern) 예시 / 예제
프로그래밍/Java

디자인 패턴 - 전략 패턴(Strategy pattern) 예시 / 예제

2018. 2. 6. 22:31
반응형



전략 패턴이란 인터페이스를 두고 클래스와 클래스를 느슨하게 연결하여


재사용할 수 있는 코드를 극대화하는 다지안 패턴 중 하나입니다.


자바, C++ 등에서 활용됩니다.


일단 예제코드를 한번 보죠.


나름 모형도 한번 만들어 봤습니다.


import java.io.File;
import java.util.ArrayList;

public class Client {
public static void main(String[] args) {
CompressionContext ctx = new CompressionContext();
//we could assume context is already set by preferences
ctx.setCompressionStrategy(new ZipCompressionStrategy());
//get a list of files...
ctx.createArchive(fileList);
}

public static class CompressionContext {
private CompressionStrategy strategy;

public void setCompressionStrategy(CompressionStrategy strategy) {
this.strategy = strategy;
}
//use the strategy
public void createArchive(ArrayList<File> files) {
strategy.compressFiles(files);
}
}

public interface CompressionStrategy {
void compressFiles(ArrayList<File> files);
}
public static class ZipCompressionStrategy implements CompressionStrategy {
public void compressFiles(ArrayList<File> files) {
}
}
public static class RarCompressionStrategy implements CompressionStrategy {
public void compressFiles(ArrayList<File> files) {
}
}
}


소스 코드는 한 클래스에 모으기 위해 전부 static으로 했습니다.


밑은 모형입니다.











흐름대로 생각해봅시다.


프로그램의 개발 도중 압축을 해야할 상황이 생겼다고 가정해 봐요.


처음에는 rar로 압축하는 코드를 짜고 계속 사용했는데 


나중엔 zip을 압축해야 하는 상황이 생기고


7zip으로 압축하는 상황이 생겼습니다.


처음부터 끝까지 수행하는 작업을 종류별로 만들어 놨는데, 이대로 확장자 별로 만들게 되면 50개가 넘는 클래스가 생기고


압축 과정에서 확장자 설정 이외의 공통되는 부분이 중복되는 상황이 발생하게 됩니다.

압축 문외한이라 실제로 그런지는 모릅니다. 압축 종류별로 공통코드가 많고 확장자 설정 코드가 적다고 가정하죠.


확장자의 종류별로 처음부터 끝까지 압축과정을 끝내는 것이 너무 비효율적이라 코드를 개선하여 중복코드를 제거하고 싶습니다.


그럴 때 이 패턴을 사용하면 됩니다.


압축이라는 하나의 맥락(Context)를 쭉 진행하다가 압축 과정의 일부인 확장자 설정 문제를 맞부딪혔다고 생각해봅시다.


이 확장자 설정은 여러개의 전략(Strategy pattern)으로 해결이 가능합니다. 그 중 하나의 전략을 선택하여 다시 압축 흐름을 진행합니다.


이 전략을 선택하는 과정은 맥락(Context)에서 다수 일 수도 있습니다.


맥락이 끝날 때 까지 전략 선택 과정을 반복하면 나중엔 흐름이 완료되고, 압축이 완료되겠죠.


클라이언트 입장에서 굉장히 유연한 선택을 할 수 있게끔 도와주는 역할을 합니다.


때문에 유용하고. 자주 쓰이는 패턴입니다.







모형을 그리다보니


회사에서 인력 부족 해결 문제에 빗대면


괜찮은 비유가 되겠다 싶어서


만들어 봤습니다.






회사가 Client


인사(=인력) 채용 프로그램이 문제 해결 맥락(Context)


채용 기준이 인터페이스


취준생들이 구체적 전략들


입니다.






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

'프로그래밍 > Java' 카테고리의 다른 글

이펙티브 자바 규칙 10 - toString은 항상 재정의하자  (0) 2018.02.06
이펙티브 자바 규칙 9 - equal 메소드를 재정의 할 때 hashCode()도 재정의 하자  (1) 2018.02.05
이펙티브 자바 규칙 8 - equals 재정의 / 오버라이드 방법  (0) 2018.02.03
    '프로그래밍/Java' 카테고리의 다른 글
    • 이펙티브 자바 규칙 12 - Comparable 구현을 고려하라
    • 이펙티브 자바 규칙 10 - toString은 항상 재정의하자
    • 이펙티브 자바 규칙 9 - equal 메소드를 재정의 할 때 hashCode()도 재정의 하자
    • 이펙티브 자바 규칙 8 - equals 재정의 / 오버라이드 방법
    타진
    타진
    vulnerable1324@gmail.com

    티스토리툴바