Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

전략 패턴 vs 커맨트 패턴 차이 #35

Open
semi-cloud opened this issue Aug 12, 2023 · 2 comments
Open

전략 패턴 vs 커맨트 패턴 차이 #35

semi-cloud opened this issue Aug 12, 2023 · 2 comments

Comments

@semi-cloud
Copy link
Contributor

semi-cloud commented Aug 12, 2023

전략 패턴과 커맨드 패턴이 비슷해 보이는데, 차이가 있을까요?

@semi-cloud
Copy link
Contributor Author

  1. 전략 패턴은 "어떻게"에 집중한다. 따라서 메서드 실행에 필요한 데이터들이 Strategy를 주입 받는 공통 클래스로부터 전달된다. 즉 메서드 시그니처가 강하게 결합되어 있기 때문에, 공통 부분과 전략 부분이 완전히 독립적이지 않다.
public class Bicycle implements Transportation {

    @Override
    public void move(String start, String end){
        System.out.println("출발점 : " + start + "에서 목적지 : " + end + "까지 `자전거`로 이동합니다.");
    }
}
  1. 커맨드 패턴은 "무엇"에 집중한다. 실제 실행에 필요한 모든 데이터들은 커맨드 구현체 내부 필드로 존재하며, 모든 요청을 받는 중앙 클래스는 단순히 커맨드에게 실행을 요청하는 방식이기 때문에 전략 패턴보다 좀 더 독립적이라고 볼 수 있다.
public class InstantScratch implements LotteryCommand {
    
    private InstantLottery instantLottery;
    private account Account;

    public InstantScratch(InstantLottery instantLottery, Account account) {
        this.instantLottery = instantLottery;
        this.account = Account;
    }

    @Override
    public void scratch() {
      //instantLottery의 당첨을 확인하고 account에 돈을 집어 넣는 로직
    }
}

https://tecoble.techcourse.co.kr/post/2021-10-04-strategy-command-pattern/

@gzgzg2
Copy link
Contributor

gzgzg2 commented Aug 13, 2023

  1. 전략 패턴은 "어떻게"에 집중한다. 따라서 메서드 실행에 필요한 데이터들이 Strategy를 주입 받는 공통 클래스로부터 전달된다. 즉 메서드 시그니처가 강하게 결합되어 있기 때문에, 공통 부분과 전략 부분이 완전히 독립적이지 않다.
public class Bicycle implements Transportation {

    @Override
    public void move(String start, String end){
        System.out.println("출발점 : " + start + "에서 목적지 : " + end + "까지 `자전거`로 이동합니다.");
    }
}
  1. 커맨드 패턴은 "무엇"에 집중한다. 실제 실행에 필요한 모든 데이터들은 커맨드 구현체 내부 필드로 존재하며, 모든 요청을 받는 중앙 클래스는 단순히 커맨드에게 실행을 요청하는 방식이기 때문에 전략 패턴보다 좀 더 독립적이라고 볼 수 있다.
public class InstantScratch implements LotteryCommand {
    
    private InstantLottery instantLottery;
    private account Account;

    public InstantScratch(InstantLottery instantLottery, Account account) {
        this.instantLottery = instantLottery;
        this.account = Account;
    }

    @Override
    public void scratch() {
      //instantLottery의 당첨을 확인하고 account에 돈을 집어 넣는 로직
    }
}

https://tecoble.techcourse.co.kr/post/2021-10-04-strategy-command-pattern/


세미님이 답변해주신 내용을 기반으로 정리해보았어요 ~
[전략패턴]

  • 수행해야할 행위가 정해져 있음 예시로 들어보자면 Light On/Off 같은 행위
  • 전략패턴의 컨셉은 Light On/Off를 수행할 알고리즘을 변경하는 것

[커맨드 패턴]

  • 커맨드 패턴은 전략패턴과 다르게 수행해야할 행위가 정해져있지 않음
    • 행위를 수행할 리시버 클래스를 커맨드 구현체에 캡슐화 해놓았기 때문에
  • 책의 예시인 RemoteControl Class를 보면 커맨드 객체를 변경하여 규격이 다른 Light On/Off와 Door Open/Close를 수행함

[결론]
전략패턴은 수행해야할 행위가 정해져있는 반면에, 커맨드 패턴은 리시버가 캡슐화 되어있기에 행위 자체가 사전에 정의되지 않음

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants