본문 바로가기
Computer Science/디자인패턴

Strategy Pattern

by _S0_H2_ 2022. 8. 24.
728x90
반응형

전략 패턴은 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있도록 해준다. 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다.

 

Robot을 상속받으면서 각자 다른 attack, move를 가진 여러 Robot을 생성해보자.


이러한 구조에서는 RobotA의 attack, move를 RobotB에서도 사용하는 경우, 같은 메소드에 대하여 구현의 중복이 일어난다. 이는 새로운 Robot을 추가하는 경우에도 같은 method에 대해서 중복이 일어난다.

 

따라서 한 곳에 attack과 move 를 인터페이스로 정의해 둔 뒤, 각 메소드에 대하여 동작을 구현하여 하나씩 꺼내와서 정의하여 중복을 피할 수 있다.

 

- 실습 C#

(위의 구조에서는 set이 있지만 아래 코드에는 set을 사용하지 않고 직접 넣어줌)

class Program{
    static void Main(string[] args)
    {
        //RobotA
        Unit unit = new RobotA(new Walk(), new Fork());
        unit.Move();
        unit.Attack();
    
        //RobotB
        unit = new RobotB(new Jump(), new Fire());
        unit.Move();
        unit.Attack();
        Console.ReadKey();
    }   

    abstract class MoveBehavior
    {
        public abstract void Move();
    }

    class Walk : MoveBehavior{
        public override void Move(){
            Console.WriteLine("Walking . . .");
        }
    }

    class Jump : MoveBehavior{
        public override void Move(){
            Console.WriteLine("J ! u ! m ! p ! ");
        }
    }

    abstract class AttackBehavior{
        public abstract void Attack();
    }

    class Fork : AttackBehavior{
        public override void Attack(){
            Console.WriteLine("f~~~~~~~ork");
        }
    }

    class Fire : AttackBehavior{
        public override void Attack(){
            Console.WriteLine("f~~i~~~r~~e");
        }
    }

    class Unit{
        private MoveBehavior move;
        private AttackBehavior attack;

        public Unit(MoveBehavior move, AttackBehavior attack){
            this.move = move;
            this.attack = attack;
        }

        public void Move(){
            move.Move();
        }

        public void Attack(){
            attack.Attack();
        }
    }
    class RobotA : Unit{
        public RobotA(MoveBehavior move, AttackBehavior attack) : base(move, attack){}
    }

    class RobotB : Unit{
        public RobotB(MoveBehavior move, AttackBehavior attack) : base(move, attack){}
    }
}



728x90
반응형

'Computer Science > 디자인패턴' 카테고리의 다른 글

Command Pattern  (0) 2022.09.28
Singleton Pattern  (0) 2022.09.26
Factory / Factory Abstract Method Pattern  (0) 2022.09.13
Decorator Pattern  (0) 2022.09.06
Observer Pattern  (0) 2022.08.30