๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP)/Design Pattern

[Design Pattern] Strategy Pattern

728x90

Strategy pattern

 

์Šคํฌ๋ฆฐ์ƒท 2021-07-25 ์˜ค์ „ 12 18 25

  • ์˜ค๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…” ํ”„๋กœ๊ทธ๋žจ
    • ๋ชจ๋“  ์˜ค๋ฆฌ๋Š” ๊ฝฅ๊ฝฅ ์šธ ์ˆ˜ ์žˆ๊ณ , ์ˆ˜์˜์„ ํ•  ์ˆ˜ ์žˆ์Œ
    • ์ด ๋‘ ์ข…๋ฅ˜์˜ ํ–‰์œ„๋Š” ์˜ค๋ฆฌ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„๋จ
    • ์˜ค๋ฆฌ์˜ display ๋ฉ”์†Œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์ž„
    • ์˜ค๋ฆฌ ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ํด๋ž˜์Šค์ž„
    • ์˜ค๋ฆฌ์˜ ๋ชจ๋“  ์ž์‹ํด๋ž˜์Šค๋Š” display ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
    • ์—ฌ๊ธฐ ๋‘ ํด๋ž˜์Šค ์™ธ์— ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋˜์–ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Œ
    • ๋ฌธ์ œ์  : ์˜ค๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด fly ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด??
  • Design Pricinple 1
    • Identify the aspects of your application that vary and separate them from what stays the same
  • Design Pricinple 2
    • Program to an interface, not an implementation
public abstract calss Duck{
  protected FlyBehavior flyBehavior;
  protected QuackBehavior quackBehavior;
  ...
  public void quack(){
    quackBehavior.quack();
  }
}
  • ์˜์กด๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•˜๋ฏ€๋กœ ๋ฐ”๋žŒ์งํ•˜์ง€ ๋ชปํ•˜๋‹ค.
    public calss MallardDuck extends Duck{
    public MallardDuck(){
      flyBehavior = new FlyWithWings();
      quackBehavior = new Quack();
    }
    public void display(){
      System.out.println("๋‚œ ์ฒญ๋‘ฅ์˜ค๋ฆฌ");
    }
    }
  • Duck์—์„œ flyBehaviordhk quackBehaviorfmf private์œผ๋กœ ๋ฐ”๊พธ์–ด ์ƒ์„ฑ์ž ๊ด€๊ณ„ ์ฃผ์ž…์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ 
    public calss MallardDuck (FlyBehavior flyBehavior, QuackBehavior quackBehavior){
    super(flyBehavior, quackBehavior);
    }

์žฅ์ 

  • flyBehavior๋ฅผ ์‹คํ–‰์‹œ๊ฐ„์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
    flyBehavior (new FlyNoWay());
    duck.fly();
    • ์ƒˆ๋กœ์šด ์˜ค๋ฆฌํƒ€์ž…์„ ๋งŒ๋“ค๊ธฐ ์‰ฌ์›€
      public class ModelDuck extends Duck{ 
      public ModelDuck(){
      flyBehavior = new FlyNoWay();
      quackBehavior = new Quack();
      }
      ...
      }
    • ์ƒˆ๋กœ์šด ํ–‰์œ„ ์ถ”๊ฐ€๊ฐ€ ์‰ฌ์›€
      public class FlyRocketPowered implements FlyBehavior {
      public void fly(){
      System.out.println(" ๋‚œ ๋กœ์ผ“์œผ๋กœ ๋‚œ๋‹ค!!!"); 
      }
      }
  • Design Pricinple 3
    • Favor composition over inheritance.

์ž๋ฐ” enum

public enum Flyable{ 
  FlyNoWay{
    @Override
    public void fly(){} 
  }
  FlyWithWings{
    @Override 
    public void fly(){
      System.out.println(" ๋‚œ ๋‚ ๊ฐœ๋กœ ๋‚œ๋‹ค!!!"); 
    }
  } 
  FlyWithRockets{
     @Override 
     public void fly(){
      System.out.println(" ๋‚œ ๋กœ์ผ“์œผ๋กœ ๋‚œ๋‹ค!!!"); }
    }
      public abstract void fly(); 
  }
public class MallardDuck extends Duck { 
  public MallardDuck(){
      setFlyStrategy(Flyable.FlyWithWings);
 }

์ž๋ฐ” Lambda

 public interface Flyable {
  void fly()
}
Flyable flyWithBallons = ()->System.out.println("ํ’์„ ์œผ๋กœ ๋‚ ๊ณ  ์žˆ์Œ"); 
Duck d = new MallardDuck();
d.display();
d.setFlyStrategy(flyWithBallons);
d.fly();
d.setFlyStrategy(()->System.out.println("Stealth ๊ธฐ๋Šฅ์œผ๋กœ ๋‚ ๊ณ  ์žˆ์Œ");
d.fly();