3_c#/OOP와 디자인 패턴

1. Strategy 패턴

Mi:sAng 2024. 10. 2. 21:26

0.Strategy 패턴 

이 패턴에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.

이를 잘 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

알고리즘은 객체의 동작이라고 볼 수 있다. 동적으로 이 "객체의 동작"을 바꿀 때 유용

    >> 알고리즘이 클래스의 정의와 독립적으로 변경될 수 있어야 할 때 사용한다.

 

 

디자인 원칙 1 : 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.

코드를 변경하는 과정에서 의도하지 않은 일이 일어나는 것을 줄이면서 시스템의 유연성을 향상시킬 수 있다.

 

디자인 원칙 2 : 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.

 

디자인 원칙 3 : 상속보다는 구성을 활용한다.

상속은 불필요한 것을 버려야하고 구성은 필요한 것을 추가하는 것이다.

전자는 전체에서 버릴게 많을 수 있고, 후자는 추가하는 것이라 편하다.

 

 

1. 예제

 

//Magic Interface
public interface Magic{
	string Name{get;}
	void Attack();
}
//Strategy of Magic
public class FireMagic : Magic
{	string name="Fire Magic";
	public string Name{get=>name;}

	public void Attack(){
		Console.WritlLine("Fire!");
	}
}

//Strategy of Magic 2
public class IceMagic : Magic
{	string name ="Ice Magic";
	public string Name{get=>name;}
	public void Attack(){
		Console.WritlLine("Ice!");
	}
}

//Context
public class MagicStrategy
{
	Magic _magic;
	public void setMagic(Magic magic){
		Console.Write(magic.Name + "->");
		this._magic =magic;
	}
	public void Attack(){
		_magic.Attack();
	}
}

//Client : Context를 실행시킴
class Program {
	static void Main(string[] args){
		//무기
		MagicStrategy wand = new MagicStrategy();
		//불 마법 설정
		wand.setMagic(new FireMagic());
		wand.Attack();
		//얼음 마법 설정
		wand.setMagic(new IceMagic());
		wand.Attack();
	}
}

 

 

Interface Icoda

class Coka : ICoda
ICoda cola = new Coka();

//이런식으로 참조가능

 

이 참조하는 부분이 어렵다

2. 핵심

-훌륭한 객체지향 디자인이라면 재사용성, 확장성, 관리의 용이성을 갖춰야한다.

-대부분의 패턴과 원칙은 소프트웨어의 변경 문제와 관련되어 있다.

-대부분의 패턴은 시스템의 일부분을 나머지 부분과 무관하게 변경하는 방법을 제공합니다.

-많은 경우에 시스템에서 바뀌는 부분을 골라내서 캡슐화해야한다.

 

'3_c# > OOP와 디자인 패턴' 카테고리의 다른 글

2. Observer 패턴  (0) 2024.10.03
0.객체 지향 언어와 C#  (0) 2024.10.02