본문 바로가기
유니티 공부/C# 문법

C# - 전략 패턴(Strategy Pattern)

by 코딩하는 돼징 2024. 5. 7.
반응형

디자인 패턴이란?

(소프트웨어)디자인 + (공통적으로 마주치는 문제를 해결하는 방법의)패턴이다.

 

전략이란?

특정한 목표를 수행하기 위한 행동계획이다.

 

예를 들어 로봇을 만든다고 해보자

로봇에는 다양한 전략 기능을 넣을 수 있다. 1) 이동 전략(걷기,뛰기, 날기) 2) 온도 전략(차갑게,뜨겁게,미지근하게)

 

전략 패턴이란?

디자인 패턴 중 하나로, 객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고 사용하며, 동적으로 전략 수정이 가능한 패턴이다. 

 

전략 패턴 구조

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%A0%84%EB%9E%B5Strategy-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

전략 : 모든 전략 구현체제에 대한 공용 인터페이스

구체적인 전략(전략 인터페이스) : 알고리즘, 행위, 동작을 객체로 정의한 구현

컨텍스트 : 알고리즘을 실행해야 할 때마다 해당 알고리즘과 연결된 전략 객체의 메소드를 호출

클라이언트 : 특정 전략 객체를 컨텍스트에 전달함으로써 전략을 등록하거나 변경하여 전략 알고리즘을 실행 결과를 얻음

 

동일 계열의 알고리즘 정의(걷기, 뛰기, 날기)한 후 각 알고리즘은 캡슐화(이동 전략)하고 상호교환이 가능하도록 만든다.  


코드 예시

전략 패턴을 사용하지 않는 코드

using System;

// 전투 유닛 클래스
public class Unit
{
    // 공격 메서드: 근접 공격
    public void MeleeAttack()
    {
        Console.WriteLine("근접 공격을 합니다.");
    }

    // 공격 메서드: 원거리 공격
    public void RangedAttack()
    {
        Console.WriteLine("원거리 공격을 합니다.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 전투 유닛 생성
        Unit unit = new Unit();

        // 근접 공격 수행
        unit.MeleeAttack();

        // 원거리 공격 수행
        unit.RangedAttack();
    }
}

전략 패턴을 사용하는 코드

using System;

// 전략 인터페이스
public interface IAttackStrategy
{
    void Attack();
}

// 구체적인 전략: 근접 공격
public class MeleeAttackStrategy : IAttackStrategy
{
    public void Attack()
    {
        Console.WriteLine("근접 공격을 합니다.");
    }
}

// 구체적인 전략: 원거리 공격
public class RangedAttackStrategy : IAttackStrategy
{
    public void Attack()
    {
        Console.WriteLine("원거리 공격을 합니다.");
    }
}

// 컨텍스트: 전투 유닛
public class Unit
{
    private IAttackStrategy attackStrategy;

    public Unit(IAttackStrategy attackStrategy)
    {
        this.attackStrategy = attackStrategy;
    }

    public void SetAttackStrategy(IAttackStrategy attackStrategy)
    {
        this.attackStrategy = attackStrategy;
    }

    public void PerformAttack()
    {
        attackStrategy.Attack();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 근접 공격 전략을 가진 전투 유닛 생성
        Unit meleeUnit = new Unit(new MeleeAttackStrategy());
        meleeUnit.PerformAttack();

        // 원거리 공격 전략으로 변경
        meleeUnit.SetAttackStrategy(new RangedAttackStrategy());
        meleeUnit.PerformAttack();
    }
}

 

 

위의 코드 예시를 보면 개방-폐쇄 원칙(Open-Closed Principle, OCP)이 떠오를 것이다. 실제로 이와 밀접하게 연결되어있다고 한다. 

 

개방-폐쇄 원칙(Open-Closed Principle, OCP) 알아보러가기

 

C# - SOLID 원칙

1. 단일 책임 원칙(Single Response Principle)이름 그대로 하나의 클래스는 하나의 책임만 갖는 원칙이다.예를 들어 플레이어와 관련된 스크립트가 있다고 해보자 그러면 플레이어의 입력, 이동 관련,

code-piggy.tistory.com

 

반응형

댓글