반응형
디자인 패턴이란?
(소프트웨어)디자인 + (공통적으로 마주치는 문제를 해결하는 방법의)패턴이다.
전략이란?
특정한 목표를 수행하기 위한 행동계획이다.
예를 들어 로봇을 만든다고 해보자
로봇에는 다양한 전략 기능을 넣을 수 있다. 1) 이동 전략(걷기,뛰기, 날기) 2) 온도 전략(차갑게,뜨겁게,미지근하게)
전략 패턴이란?
디자인 패턴 중 하나로, 객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고 사용하며, 동적으로 전략 수정이 가능한 패턴이다.
전략 패턴 구조
전략 : 모든 전략 구현체제에 대한 공용 인터페이스
구체적인 전략(전략 인터페이스) : 알고리즘, 행위, 동작을 객체로 정의한 구현
컨텍스트 : 알고리즘을 실행해야 할 때마다 해당 알고리즘과 연결된 전략 객체의 메소드를 호출
클라이언트 : 특정 전략 객체를 컨텍스트에 전달함으로써 전략을 등록하거나 변경하여 전략 알고리즘을 실행 결과를 얻음
동일 계열의 알고리즘 정의(걷기, 뛰기, 날기)한 후 각 알고리즘은 캡슐화(이동 전략)하고 상호교환이 가능하도록 만든다.
코드 예시
전략 패턴을 사용하지 않는 코드
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# 문법' 카테고리의 다른 글
C# - 상태 패턴(State Pattern) (0) | 2024.05.07 |
---|---|
C# - SOLID 원칙 (0) | 2024.05.06 |
C# - const와 readonly (0) | 2024.04.09 |
C# - 클래스(Class)와 구조체(Struct)의 차이 (0) | 2024.03.29 |
C# 문법 - 값 타입(Value type)과 참조 타입(Reference type) (0) | 2024.03.29 |
댓글