[設計モード]Strategy Pattern


Behavioral Pattern - Strategy Pattern

📚 意図する


同じ一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、互いに交換します.
アルゴリズムを使用するクライアントとは独立して、アルゴリズムを大幅に変更できます.(GoF)사진사スマホで撮影できる사진 찍기、フィルムカメラやカメラで撮影できる.このような多様な形で起こり得る事象については,すべてのアルゴリズムをクラスごとに分類して전략と呼ぶ.

🧱 こうぞう


  • Context : strategy
  • カメラマン
  • 戦略の1つを含む領域を持たなければならない.
  • 戦略を知る必要はありません.(Strategy interface)
  • Client :
  • 欲しい戦略を生成してContextに渡す.
  • Strategy :
  • 写真コネクタ
  • Contextが戦略実施に必要な方法を発表した.
  • ConcreteStrategies :
  • 複数のアルゴリズムを用いてポリシーを実装する実施形態.
  • 💻 コード#コード#


  • モード適用前
    // 1. 기존 전략: 핸드폰 카메라
    public class Client {
        public static void main(String[] args) {
            takeMobilePhoto();
        }
    }
    
    // 2. 필름 카메라로도 찍고 싶다.
    public class Client {
        public static void main(String[] args) {
            int strategy = 2;
            takePhoto(strategy);
        }
    
        private static void takePhoto(int strategy) {
            if (strategy == 1) {
                takeMobilePhoto();
            } else if (strategy == 2) {
                takeFilmPhoto();
            }
        }
    
        private static void takeMobilePhoto() {
            System.out.println("핸드폰 카메라 촬영");
        }
    
        private static void takeFilmPhoto() {
            System.out.println("필름 카메라 촬영");
        }
    }
    
    // 3. 폴라로이드 카메라도 추가
    public class Client {
        public static void main(String[] args) {
            int strategy = 3;
            takePhoto(strategy);
        }
    
        private static void takePhoto(int strategy) {
            if (strategy == 1) {
                takeMobilePhoto();
            } else if (strategy == 2) {
                takeFilmPhoto();
            } else if (strategy == 3) {
                takePolaroidPhoto();
            }
        }
    
        private static void takeMobilePhoto() {
            System.out.println("핸드폰 카메라 촬영");
        }
    
        private static void takeFilmPhoto() {
            System.out.println("필름 카메라 촬영");
        }
    
        private static void takePolaroidPhoto() {
            System.out.println("폴라로이드 카메라 촬영");
        }
    }
  • 適用モード後

  • Context
    public class Photographer {
        PhotoBehavior photoBehavior;
    
        public Photographer(PhotoBehavior photoBehavior) {
            this.photoBehavior = photoBehavior;
        }
    
        public void performTakePhoto() {
            photoBehavior.takePhoto();
        }
    
        public void setPhotoBehavior(PhotoBehavior photoBehavior) {
            System.out.println("\n전략 변경\n");
            this.photoBehavior = photoBehavior;
        }
    }

  • Client
    public class Client {
        public static void main(String[] args) {
            PhotoBehavior behavior = new MobilePhotoBehavior();
            Photographer photographer = new Photographer(behavior);
            photographer.performTakePhoto();
    
            behavior = new FilmCameraPhotoBehavior();
            photographer.setPhotoBehavior(behavior);
            photographer.performTakePhoto();
    
            behavior = new PolaroidPhotoBehavior();
            photographer.setPhotoBehavior(behavior);
            photographer.performTakePhoto();
        }
    }

  • Strategy
    public interface PhotoBehavior {
        void takePhoto();
    }

  • Concrete Strategies
    public class MobilePhotoBehavior implements PhotoBehavior {
        @Override
        public void takePhoto() {
            System.out.println("핸드폰 카메라로 촬영");
        }
    }
    public class FilmCameraPhotoBehavior implements PhotoBehavior {
        @Override
        public void takePhoto() {
            System.out.println("필름 카메라로 촬영");
        }
    }
    public class PolaroidPhotoBehavior implements PhotoBehavior {
        @Override
        public void takePhoto() {
            System.out.println("폴라로이드 카메라로 촬영");
        }
    }

  • Console
    // 출력
    핸드폰 카메라로 촬영
    
    전략 변경
    
    필름 카메라로 촬영
    
    전략 변경
    
    폴라로이드 카메라로 촬영
  • 🔮 メリットとデメリット

  • メリット
  • 運転時にアルゴリズムを変更可能
  • コアコードと具体的なアルゴリズムを分けることができる.
  • オープン原則:Contextまたはその他のコンテンツポリシーを変更せずに新規ポリシーを追加する
  • デメリット
  • いくつかのアルゴリズムがなければモードのみに適用される.