본문 바로가기
프로그래밍/디자인패턴

자바 전략 패턴

by 방구석개발자 2022. 11. 3.
반응형

설명 및 왜 사용해야 하는지

알고리즘을 클래스화해서 객체의 행동을 쉽게 변경할 수 있는 패턴입니다.

실시간으로 객체의 행동을 변경해야 할 필요가 있을때 사용합니다.

전략의 수정과 추가에 따른 클라이언트의 의존성을 제거하여 전략을 쉽게 변경 할 수 있습니다.

실시간으로 전략을 선택하여 객체의 행동을 변경 할 수 있습니다.

예를 들어서

포토샵에서 작업한 이미지를 여러 포맷(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 )

 

Comparator (Java Platform SE 8 )

Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. In the foregoing description, the notation sgn(expression) designates the mathematical s

docs.oracle.com

 

감사합니다.

반응형

'프로그래밍 > 디자인패턴' 카테고리의 다른 글

자바 커맨드(Command) 패턴  (0) 2022.12.12
자바 데커레이터(Decorator) 패턴  (0) 2022.11.15
자바 프록시 패턴  (0) 2022.11.01
자바 빌더 패턴  (0) 2022.10.30
자바 팩토리 메서드 패턴  (0) 2022.10.25

댓글