[Design Patterns] 1. Strategy

onlydev7777·2024년 10월 6일

☀️ 개요

Head First Design Patterns 책을 학습하며 공부한 내용을 정리한다.

🤔 Strategy-Patterns 이란?

가장 많이 쓰이는 패턴 중 하나로 추상화된 인터페이스로 캡슐화해서 각각을 교환해서 사용할 수 있도록 만든다. 이 패턴을 활용하면 클라이언트는 독립적으로 알고리즘을 변경할 수 있다.

Strategy-Patterns

1. Duck

추상클래스로서 FlyBehavior 인터페이스와 QuackBehavior 인터페이스를 주입 받아 performFly / performQuack 메서드에서 캡슐화 된 상태로 사용한다.

public abstract class Duck {

  protected FlyBehavior flyBehavior;
  protected QuackBehavior quackBehavior;

  public void swim() {
    System.out.println("Duck.swim");
  }

  public void display() {
    System.out.println("Duck.display");
  }

  public void performFly() {
    flyBehavior.fly();
  }

  public void performQuack() {
    quackBehavior.quack();
  }
  //기타 오리 메서드


  public void setFlyBehavior(FlyBehavior flyBehavior) {
    this.flyBehavior = flyBehavior;
  }

  public void setQuackBehavior(QuackBehavior quackBehavior) {
    this.quackBehavior = quackBehavior;
  }
}

2. ModelDuck

Duck 추상 클래스의 서브 클래스로서 FlyBehavior 의 구현체인 FlyNoWay를 주입하고 QuackBehavior 의 구현체인 Quack 클래스를 주입 해서 사용한다.

  • 인형오리 이기 때문에 날지 못하고 소리는 난다.
public class ModelDuck extends Duck {

  public ModelDuck() {
    this.flyBehavior = new FlyNoWay();
    this.quackBehavior = new Quack();
  }

  @Override
  public void display() {
    System.out.println("ModelDuck.display");
  }
}

3. MallardDuck

Duck 추상 클래스의 서브 클래스로서 FlyBehavior 의 구현체인 FlyWithWings를 주입하고 QuackBehavior 의 구현체인 Quack 클래스를 주입 해서 사용한다.

  • 청동오리 이기 때문에 날개로 날 수 있고 소리도 난다.
public class MallardDuck extends Duck {

  public MallardDuck() {
    this.quackBehavior = new Quack();
    this.flyBehavior = new FlyWithWings();
  }

  @Override
  public void display() {
    System.out.println("MallardDuck.display");
  }
}

4. FlyBehavior

어떻게 날으는 지를 의미하는 인터페이스

public interface FlyBehavior {

  void fly();
}

5. FlyNoWay, FlyWithWings

FlyNoWay : 날지 못하는 오리를 의미하는 FlyBehavior 구현 클래스
FlyWithWings : 날개로 나는 오리를 의미하는 FlyBehavior 구현 클래스

public class FlyNoWay implements FlyBehavior {

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

  @Override
  public void fly() {
    System.out.println("FlyWithWings.fly");
  }
}

6. QuackBehavior

꽥 소리가 어떻게 나는 지를 의미하는 인터페이스

public interface QuackBehavior {

  void quack();
}

7. Quack, MuteQuack

Quack : 꽥 하고 소리내는 오리를 정의한 QuackBehavior 구현 클래스
MuteQuack : 소리를 내지 못하는 오리를 정의한 QuackBehavior 구현 클래스

public class Quack implements QuackBehavior {

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

  @Override
  public void quack() {
    System.out.println("MuteQuack.quack");
  }
}

❗️ 디자인 원칙

  1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로 부터 분리 시킨다.
  2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.
  3. 상속(A는 B이다) 보다는 구성(A에는 B가 있다)을 활용한다.

★ Github

https://github.com/onlydev7777/TIL/tree/main/design-patterns

profile
https://github.com/onlydev7777

0개의 댓글