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 |