[디자인 패턴] 전략 패턴 (Strategy Pattern)

최진민·2021년 11월 14일
0

디자인 패턴

목록 보기
3/10
post-thumbnail
  • 전략 패턴?
  • 사용 이유
  • 구현

🐷 1. 전략 패턴?

  • 전략 패턴 (Strategy Pattern)
    • 객체의 행위에 대한 전략 클래스를 생성하여 유사한 행위를 캡슐화 한 인터페이스를 정의
    • 행위를 동적으로 변경하고자 할 때, 직접 수정하지 않고 전략만을 바꾸기 때문에 행위를 유연하게 확장할 수 있다.


🐰 2. 사용 이유

  • 사람(User)과 복싱(Boxing), 태권도(Taekwondo)로 예를 들어보자.

    public interface Fighting {
        void fight();
    }
    public class Boxing implements Fighting {
        @Override
        public void fight() {
            System.out.println("주먹으로 싸우다.");
        }
    }
    public class Taekwondo implements Fighting {
        @Override
        public void fight() {
            System.out.println("발차기로 싸우다.");
        }
    }
    public class User {
        public static void main(String args[]){
            Fighting boxing = new Boxing();
            Fighting taekwondo = new Taekwondo();
    
            boxing.fight();
            taekwondo.fight();
        }
    }
    • 복싱은 주먹을 사용하여 싸우고, 태권도는 발차기를 사용하여 싸운다.

    • 시간이 흘러 태권도에서도 주먹을 사용할 수 있을 때,

      public class Taekwondo implements Fighting {
          @Override
          public void fight() {
              System.out.println("주먹으로 싸우다.");
          }
      }
      • 위와 같이 Taekwondo.fight()를 직접 수정
    • 문제 상황

      1. 위와 같은 수정 방식은 SOLID 원칙 중, OCP (Open-Closed Principle)에 위배되는 행위
      2. 시스템 확장 시, 메서드 중복
        • 태권도와 복싱 뿐만 아니라 여러 경기가 등장할 때마다, fight()를 변경해야 한다.
    • 문제 상황을 해결하기 위해 전략 패턴을 사용하자



🐯 3. 구현

  • 구현 방법

    • 객체의 행위 대한 전략 클래스와 이를 캡슐화 하는 인터페이스를 구현
    • 경기 방식에 대한 클래스인터페이스 구현
    • 경기에 오르는 User 구현
  • 전략

    public interface FightStrategy {
        void fight();
    }
    public class Funch implements FightStrategy {
        @Override
        public void fight() {
            System.out.println("주먹으로 싸우다.");
        }
    }
    public class Kick implements FightStrategy {
        @Override
        public void fight() {
            System.out.println("발차기로 싸우다.");
        }
    }
  • 경기 방식

    public class Play {
        private FightStrategy fightStrategy;
    
        public void fight() {
            fightStrategy.fight();
        }
    
        public void setFightStrategy(FightStrategy fightStrategy) {
            this.fightStrategy = fightStrategy;
        }
    }
    public class Boxing extends Play {
    }
    
    public class Taekwondo extends Play {
    }
  • 유저

    public class User {
        public static void main(String args[]){
            Play boxing = new Boxing();
            Play taekwondo = new Taekwondo();
    
            /**
             * 기존에 복싱은 주먹만을 사용하고,
             * 태권도는 발차기만을 사용한다.
             */
            boxing.setFightStrategy(new Funch());
            taekwondo.setFightStrategy(new Kick());
    
            System.out.print("복싱 : ");
            boxing.fight();
            System.out.print("태권도 : ");
            taekwondo.fight();
    
            /**
             * 추후, 태권도가 주먹을 사용한다.
             */
            taekwondo.setFightStrategy(new Funch());
            System.out.println("******태권도가 주먹을 사용하게 된 후*******");
    
            System.out.print("복싱 : ");
            boxing.fight();
            System.out.print("태권도 : ");
            taekwondo.fight();
        }
    }
    • 결과
  • Git : https://github.com/JinMinChoi/Design-Pattern/

profile
열심히 해보자9999

0개의 댓글