전략 패턴 (Strategy Pattern)

2021. 1. 19. 22:06·[CS] - Design Pattern

스트레티지 패턴은 행위를 클래스로 캡슐화하여 동적으로 바꿀 수 있게 해주는 패턴이다. 이번 포스트에서는 귀납적으로 코드를 살펴보겠다.

public class DuckSimulator {
    public static void main(String[] args) {
        Duck mallard = new MarllardDuck();
        
        mallard.performQuack(); // 꽥꽥
        mallard.performFly(); // 난다!
        
        // 캡슐화된 행위를 바꾸는 부분
        mallard.setFlyBehavior(new FlyNoWay());
        mallard.setQuackBehavior(new SQuack());
        
        mallard.performQuack(); // 삑삑
        mallard.performFly(); // 날지 못해용.
    }
}

위 코드는 클라이언트에서 mallard의 행위를 전략적으로(Strategy)바꾼 것이다. 다음은 mallardDuck 클래스를 살펴보자.

public class MallardDuck extends Duck {
    public MarllardDuck() {
        flyBehavior = new FlyWithWings();
        quackBehavior = new Quack();
    }
}

public abstract class Duck {
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    
    // setter - 짖는 행위 변경
    public void setQuackBehavior(QuackBehavior quackBehavior) {
       	this.quackBehavior = quackBehavior;
    }
    
    // setter - 나는 행위 변경
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }
    
    // 짖는 행위 수행
    public void performQuack() {
        quackBehavior.quack();
    }
    
    // 나는 행위 수행
    public void performFly() {
       flyBehavior.fly();
    }
}

MallardDuck은 나는 행위(FlyBehavior)를 FlywithWings, 짖는 행위(QuackBehavior)를 Quack으로 설정했다.

나는 행위(FlyBehavior)의 종류 : FlyWithWings, FlyNoWay

짖는 행위(QuackBehavior)의 종류 : Quack, SQuack, MuteQuack

 

이제 캡슐화된 행위를 볼 차례이다.

public interface FlyBehavior {
    public void fly();
}

public class FlyWithWings implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("난다!");
    }
}

public class FlyNoWay implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("날지 못해용.");
    }
}
public interface QuackBehavior {
    public void quack();
}

public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("꽥꽥");
    }
}

public class SQuack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("삑삑");
    }
}

public class MuteQuck implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("조용");
    }
}

위와 같이 행위를 캡슐화하여 상황에 따라 유연하고 전략적으로 특정 객체에 대한 행위를 바꿀 수 있다.

'[CS] - Design Pattern' 카테고리의 다른 글

싱글턴 패턴 응용  (0) 2021.08.04
컴포지트 패턴 (Composite Pattern)  (0) 2021.01.19
데코레이터 패턴 (Decorator Pattern)  (0) 2020.12.28
싱글턴 패턴 (Singletone Pattern)  (0) 2020.12.10
GoF 디자인 패턴  (2) 2020.12.07
'[CS] - Design Pattern' 카테고리의 다른 글
  • 싱글턴 패턴 응용
  • 컴포지트 패턴 (Composite Pattern)
  • 데코레이터 패턴 (Decorator Pattern)
  • 싱글턴 패턴 (Singletone Pattern)
Bebsae
Bebsae
  • Bebsae
    뱁새zip
    Bebsae
  • 전체
    오늘
    어제
    • 분류 전체보기 (108)
      • [DevOps] - Kubernetes (5)
      • [DevOps] - AWS (1)
      • [AI] - Machine Learning (19)
      • [AI] - Neural Network (7)
      • [CS] - Network (2)
      • [CS] - Data Structure (3)
      • [CS] - Design Pattern (6)
      • [Language] - Python (15)
      • [Library] - Numpy (7)
        • Quick Start (5)
        • API (2)
      • [Framework] - Django (3)
      • [Framework] - QGIS (6)
      • [Framework] - PyQT (4)
      • [Mathematics] - Linear Alge.. (14)
      • [Mathematics] - Statistical (2)
      • [ETC] - Python (3)
      • [ETC] - C++ (1)
      • [ETC] - Linux (1)
      • 논문 (5)
      • 회고록 (3)
      • 생산성 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    Machine
    선형대수
    Convolution
    linearalgebra
    RNN
    QGIS
    Learning
    decomposition
    algebra
    Python
    신경망
    교차검증
    numpy
    디자인패턴
    MachineLearning
    머신러닝
    분해
    DEEPLEARNING
    파이썬
    Linear
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Bebsae
전략 패턴 (Strategy Pattern)
상단으로

티스토리툴바