[設計モード]Strategy Pattern
Behavioral Pattern - Strategy Pattern
同じ一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、互いに交換します.
アルゴリズムを使用するクライアントとは独立して、アルゴリズムを大幅に変更できます.(GoF)
Context : カメラマン 戦略の1つを含む領域を持たなければならない. 戦略を知る必要はありません.(Strategy interface) Client : 欲しい戦略を生成してContextに渡す. Strategy : 写真コネクタ Contextが戦略実施に必要な方法を発表した. ConcreteStrategies : 複数のアルゴリズムを用いてポリシーを実装する実施形態.
モード適用前 適用モード後
Context
Client
Strategy
Concrete Strategies
Console メリット 運転時にアルゴリズムを変更可能 コアコードと具体的なアルゴリズムを分けることができる. オープン原則:Contextまたはその他のコンテンツポリシーを変更せずに新規ポリシーを追加する デメリット いくつかのアルゴリズムがなければモードのみに適用される.
📚 意図する
同じ一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、互いに交換します.
アルゴリズムを使用するクライアントとは独立して、アルゴリズムを大幅に変更できます.(GoF)
사진사
スマホで撮影できる사진 찍기
、フィルムカメラやカメラで撮影できる.このような多様な形で起こり得る事象については,すべてのアルゴリズムをクラスごとに分類して전략
と呼ぶ.🧱 こうぞう
strategy
💻 コード#コード#
モード適用前
// 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
// 출력
핸드폰 카메라로 촬영
전략 변경
필름 카메라로 촬영
전략 변경
폴라로이드 카메라로 촬영
🔮 メリットとデメリット
Reference
この問題について([設計モード]Strategy Pattern), 我々は、より多くの情報をここで見つけました https://velog.io/@jummi10/디자인-패턴-Strategy-Patternテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol