ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스트래티지 패턴 (Strategy Pattern)
    Develpment/Design Pattern 2020. 9. 13. 21:18

    1. 스트래티지 패턴


    알고리즘군을 정의하고 각각을 캡슐화하여 바꿔 쓸 수 있게 만듭니다. 스트래티지 패턴을 이용하면 알고리즘을 활용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있습니다.


     


    1-1. 객체지향의 기초

      • 추상화
      • 캡슐화
      • 다형성
      • 상속


    1-2. 객체지향 원칙


      • 바뀌는 부분은 캡슐화 한다.
      • 상속보다는 구성을 활용한다.
      • 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.


    1-3. Sample Source

      • Quack

     QuackBehavior.java

     

    1
    2
    3
    4
    5
    6
    package fly;
     
    public interface FlyBehavior {
        public void fly();
    }
     
    cs


     Quack.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package quack;
     
    public class Quack implements QuackBehavior{
     
        @Override
        public void quack() {
            System.out.println("꽥꽥~");
        }
        
    }
     
    cs


      MuteQuack.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package quack;
     
    public class MuteQuack implements QuackBehavior{
     
        @Override
        public void quack() {
            System.out.println("...");        
        }
    }
     
    cs


      Squeak.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package quack;
     
    public class Squeak implements QuackBehavior{
     
        @Override
        public void quack() {
            System.out.println("삑 삑~");        
        }
     
    }
     
    cs


      • fly

     FlyBehavior.java

     

    1
    2
    3
    4
    5
    6
    package fly;
     
    public interface FlyBehavior {
        public void fly();
    }
     
    cs


     FlyNoWay.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package fly;
     
    public class FlyNoWay implements FlyBehavior{
     
        @Override
        public void fly() {
            System.out.println("못날아...");
        }
    }
     
    cs


     FlyWithWings.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package fly;
     
    public class FlyWithWings implements FlyBehavior{
     
        @Override
        public void fly() {
            System.out.println("날고 있넹~");
        }
     
    }
     
    cs


     FlyRocketPowered.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package fly;
     
    public class FlyRocketPowered implements FlyBehavior{
     
        @Override
        public void fly() {
            System.out.println("로케트~~~~~~~~");
        }
    }
     
    cs


      • duck

     Duck.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    package duck;
     
    import fly.FlyBehavior;
    import quack.QuackBehavior;
     
    public abstract class Duck {
        
        /* 행동 인터페이스 형식의 레퍼런스 변수 두개를 선언합니다.
         * (같은 패키지에 속하는)모든 서브 클래스에서 이 변수를 상속 받습니다.
         */
        QuackBehavior quackBehavior;
        FlyBehavior flyBehavior;
        
        public void performQuack(){
            quackBehavior.quack();    // 꽥꽥 거리는 행동을 직접 처리하는 대신, quackBehavior로 참조되는 객체에 그 행동을 위임.
        }
        
        public void performFly(){
            flyBehavior.fly();        // 행동 클래스에 위임.
        }
        
        public void swim(){
            System.out.println("모든 오리는 물에뜸...");
        }
        
        abstract void display();
        
        
        // 오리의 행동을 즉석에서 바꾸고 싶으면 언제든지 이 두 메소드를 호출
        public void setFlyBehavior(FlyBehavior fb){
            flyBehavior = fb;
        }
        
        public void setQuackBehavior(QuackBehavior qb){
            quackBehavior = qb;
        }
    }
     
    cs


     MallardDuck.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package duck;
     
    import fly.FlyWithWings;
    import quack.Quack;
     
    public class MallardDuck extends Duck{
        
        public MallardDuck() {
            quackBehavior = new Quack();
            flyBehavior = new FlyWithWings();
        }
     
        @Override
        public void display(){
            System.out.println("저는 물오리입니다.");
        }
    }
    cs


     ModelDuck.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package duck;
     
    import fly.FlyNoWay;
    import quack.Quack;
     
    public class ModelDuck extends Duck{
        public ModelDuck() {
            flyBehavior = new FlyNoWay();
            quackBehavior = new Quack();
        }
        
        public void display(){
            System.out.println("모형 오리...");
        }
    }
     
    cs


      • Simulation

     MiniDuckSimulator.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package duck;
     
    import fly.FlyRocketPowered;
     
    public class MiniDuckSimulator {
        public static void main(String[] args) {
            Duck mallard = new MallardDuck();
            mallard.performQuack();
            mallard.performFly();
            
            System.out.println("----------------------------------------");
            
            Duck model = new ModelDuck();
            model.performFly();
            model.setFlyBehavior(new FlyRocketPowered());
            model.performFly();
        }
    }
     
    cs


    1-4. 실행결과


    꽥꽥~

    날고 있넹~

    ----------------------------------------

    못날아...

    로케트~~~~~~~~


    댓글

Designed by Tistory.