아키텍쳐 & 디자인패턴

[스터디] 헤드퍼스트 디자인 패턴 - 1. Strategy pattern

땅콩콩 2023. 9. 14. 19:50

학교에서 소프트웨어 디자인패턴 수업을 듣게되었는데 부교재로 이 책을 사게되었다.

 

난 몰랐는데 디자인패턴쪽에서는 유명한 책이라고 한다!

학교에서 진도나가는 주교재는 영어 원서여서 이건 스터디하는데에 사용하기로..

아무튼 유난님과 매주 한챕터씩 읽고 주 1회씩 줌으로 스터디를 하기로 했다! 

대학생도 힘든 스터디를 회사 다니면서 하는... 아무튼 정말 대단하네요....

히튼 그래서 사실 첫 스터디는 저번주에 했는데 정리하는걸 깜빡했어!!!

지금이라도 하도록 하겠어요

 

전략패턴 (Strategy Pattern)

알고리즘군을 캡슐화해서 각각의 알고리즘들을 수정해서 쓸 수 있게 하는 패턴.

클라이언트로부터 알고리즘을 분리해서 독립적으로 쓸 수 있게 하는 패턴.

 

배운 것
  • 변화하는 부분은 뽑아서 캡슐화하자!
  • 구현보다는 추상(인터페이스)에 의존하는 프로그래밍이 더 좋은 프로그램이라는 것을 알게되었다. -> 왜? 정책이나 전략에 변동이 있다고 하더라도 클라이언트 코드는 변경할 필요가 없기 때문이다.
  • 다시말해 상속보다는 구성이 낫다! (객체가 알고리즘들을 추상화한 인터페이스들을 포함하도록.. )
  • 상속해서 직접 구현체를 만들고 메소드를 오버라이딩해서 실행하는것이 아니라, 인터페이스에 의존하게 만들어서 클라이언트 코드는 그 구체적인 객체를 모르고 그냥 실행시키게 해야한다.
public abstract class Duck {

    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;

    public Duck(){}

    public abstract void display();

    public void performFly(){
        flyBehavior.fly(); //이렇게!!
    }

    public void performQuack(){
        quackBehavior.quack(); //이렇게!!
    }

    public void swim(){
        System.out.println("모든 오리는 물에 뜹니다. 가짜 오리도 뜨죠.");
    }

    public void setFlyBehavior(FlyBehavior fb){
        flyBehavior = fb;
    }

    public void setQuackBehavior(QuackBehavior qb){
        quackBehavior = qb;
    }
    
}
public class Main {
    public static void main(String[] args) {
    
        Duck mallard = new MallardDuck();
        mallard.performQuack();
        mallard.performFly();

        Duck model = new ModelDuck();
        model.performFly();
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
}

'아키텍쳐 & 디자인패턴' 카테고리의 다른 글

OOAD(Object Oriented Analysis and Design) (1)  (19) 2023.04.23