반응형
설명 및 왜 사용해야 하는지
알고리즘을 클래스화해서 객체의 행동을 쉽게 변경할 수 있는 패턴입니다.
실시간으로 객체의 행동을 변경해야 할 필요가 있을때 사용합니다.
전략의 수정과 추가에 따른 클라이언트의 의존성을 제거하여 전략을 쉽게 변경 할 수 있습니다.
실시간으로 전략을 선택하여 객체의 행동을 변경 할 수 있습니다.
예를 들어서
포토샵에서 작업한 이미지를 여러 포맷(jpg,gif,png)로 저장할때
게임 캐릭터의 공격무기를 다양하게 선택 할때 입니다.
예시
저희는 이제 포토샵 개발자가 되었습니다!
포토샵에서 이미지를 저장할때 pdf, jpg, 클립보드 등 다양한 포맷으로 저장을 하게 하는데요.
저장 방식을 전략패턴으로 한번 코딩해보겠습니다.
우선 추상클래스로 Image가 있습니다.
public abstract class Image {
private SavingStrategy strategy;
public void save() {
if(Objects.isNull(strategy)){
System.out.println("저장 방식이 없습니다.");
return;
}
strategy.save();
}
public void setStrategy(SavingStrategy strategy) {
this.strategy = strategy;
}
}
이미지는 각각 png, jpg image클래스로 구현되어 있습니다.
public class JpgImage extends Image {
}
public class PngImage extends Image {
}
저장전략 인터페이스는 간단한데요. 구현체에서 저장 알고리즘을 만들도록 save()메소드만 존재합니다.
public interface SavingStrategy {
void save();
}
이 전략 인터페이스를 구현한 pdfSaving이 있습니다.
public class PdfSaving implements SavingStrategy {
@Override
public void save() {
System.out.println("pdf로 저장 합니다.");
}
}
이제 클라이언트는 저장방식을 정하여 save()하면 됩니다.
public class PhotoShopClient {
public static void main(String[] args) {
System.out.println("신나게 일하는 중..");
Image image = new PngImage();
System.out.println("저장하자!");
SavingStrategy strategy = new PdfSaving();
image.setStrategy(strategy);
image.save();
System.out.println("저장했으니 퇴근해야지..");
System.out.println("--------------------------");
System.out.println("다시 일하는 중..");
Image jpgImage = new JpgImage();
System.out.println("저장하자!");
jpgImage.setStrategy(()-> System.out.println("클립보드로 저장되었습니다."));
jpgImage.save();
System.out.println("저장했으니 퇴근해야지..");
}
}
해당코드는 여기에 있습니다.
자바 예시
자바에서는 Collections 에서 sort를 매개변수로 받아서 비교하는 전략을 받아서 사용합니다.
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
Comparator (Java Platform SE 8 )
감사합니다.
반응형
'프로그래밍 > 디자인패턴' 카테고리의 다른 글
자바 커맨드(Command) 패턴 (0) | 2022.12.12 |
---|---|
자바 데커레이터(Decorator) 패턴 (0) | 2022.11.15 |
자바 프록시 패턴 (0) | 2022.11.01 |
자바 빌더 패턴 (0) | 2022.10.30 |
자바 팩토리 메서드 패턴 (0) | 2022.10.25 |
댓글