C\#디자인 모델 시리즈 튜 토리 얼-전략 모델
다시 한 번 예 를 들 어 우리 가 WCF 를 사용 할 때 이 를 확장 하 는 것 을 피 할 수 없다.예 를 들 어 권한 수 여 는 사용자 정의 권한 수 여 를 통 해 WCF 를 확장 할 수 있다.이 곳 에서 저 희 는 AuthorizationPolicy 와 Service AuthorizationManager 를 사용자 정의 하여 확장 할 수 있 습 니 다.이것 은 전략 모델 의 실제 응용 입 니 다.
1.개술
이 는 알고리즘 가족 을 정의 하고 각각 밀봉 하여 서로 바 꿀 수 있 도록 합 니 다.이 모델 은 알고리즘 의 변화 가 알고리즘 을 사용 하 는 클 라 이언 트 에 영향 을 주지 않도록 합 니 다.
2.모드 속 캐릭터
2.1 정책 클래스(Strategie):지원 하 는 모든 알고리즘 을 정의 하 는 공공 인터페이스 입 니 다.
2.2 구체 적 인 전략 류(Concrete Strategie):구체 적 인 알고리즘 이나 행 위 를 봉인 하여 Strategie 류 에 계승 한다.
2.3 컨 텍스트 클래스(Context):하나의 Concrete Strategie 로 설정 하고 Strategie 대상 에 대한 인용 을 유지 합 니 다.
첫 번 째 사례 를 비교 하여 이 모델 의 역할 을 분석 해 보 세 요.
공항 에서 XXX 호텔 까지 의 이 예 에서 전략 류 에는 반드시 GoToHotel 이라는 방법 이 포함 되 어야 한다.구체 적 인 전략 류 는 전략 류 를 실현 하거나 계승 해 야 하 며 그 실현 은 말 할 필요 가 없다.문맥 류,이런 유형 은 매우 중요 하고 재 미 있 습 니 다.왜냐하면 어떤 전략 을 사용 해 야 하 는 지 선택해 야 하기 때 문 입 니 다.예 를 들 어 이 상하 저 는 저 입 니 다.저 는 공항 에서 XXX 호텔 까지 가 겠 습 니 다.1)저 는 돈 이 부족 하지 않 고 호텔 도 마중 서 비 스 를 제공 합 니 다.그러면 저 는 반드시 호텔 로 마중 을 나 가 야 합 니 다.2)호텔 에서 픽업 을 제공 하지 않 으 면 전 화 를 걸 겠 습 니 다.3)내 주머니 사정 이 여의 치 않 으 면 대중 교통 을 선택 할 수 있다.4)만약 에 내 가 지금 돈 을 다 써 서 밥 먹 을 돈 도 없다 면 나 는 걸 어서 갈 수 밖 에 없다.도중에 밥 을 빌 어야 할 지도 모른다!
3.패턴 판독
3.1 전략 모델 의 일반 화 된 도표
3.2 전략 모델 의 코드 실현
/// <summary>
/// ,
/// </summary>
public abstract class Stratege
{
/// <summary>
/// , , 。
/// </summary>
public abstract void Algorithm();
}
/// <summary>
/// A,
/// </summary>
public class ConcreteStrategeA : Stratege
{
/// <summary>
///
/// </summary>
public override void Algorithm()
{
// A
}
}
/// <summary>
/// B,
/// </summary>
public class ConcreteStrategeB : Stratege
{
/// <summary>
///
/// </summary>
public override void Algorithm()
{
// B
}
}
/// <summary>
/// Context , Stratege
/// </summary>
public class Context
{
private Stratege m_Stratege;
/// <summary>
/// ,
/// </summary>
/// <param name="stratege"></param>
public Context(Stratege stratege)
{
m_Stratege = stratege;
}
/// <summary>
/// ,
/// </summary>
public void ExecuteAlgorithm()
{
m_Stratege.Algorithm();
}
}
4.모델 총화4.1 장점
4.1.1 전략 모델 은 일련의 알고리즘 을 정의 하 는 방법 이다.개념 적 으로 볼 때 모든 알고리즘 이 똑 같은 작업 을 완성 했다.다만 서로 다른 방식 으로 모든 알고리즘 을 호출 하여 각종 알고리즘 류 와 사용 알고리즘 류 간 의 결합 을 줄 일 수 있다.
4.1.2 전략 모델 의 Strategie 류 는 Context 로 일련의 재 활용 가능 한 알고리즘 이나 행 위 를 정의 했다.계승 은 이 알고리즘 들 의 공공 기능 을 분석 하 는 데 도움 이 된다.
4.1.3 전략 모델 은 모든 알고리즘 이 자신의 유형 을 가지 고 자신의 인 터 페 이 스 를 통 해 단독 적 으로 테스트 할 수 있다.그래서 단원 테스트 를 간소화 했다.
4.1.4 전략 모델 은 구체 적 인 알고리즘 이나 행 위 를 Stratege 류 에 밀봉 하고 이런 유형 에서 조건 부 분 지 를 제거 할 수 있다(서로 다른 행위 가 한 가지 유형 에 쌓 이 는 것 을 피한다).
4.2 단점
구체 적 인 전략 을 선택 하 는 직책 을 클 라 이언 트 에 게 맡 기 고 Context 대상 에 게 전달 합 니 다.
4.3 적용 필드
4.3.1 특정한 기능 을 실현 하려 면 서로 다른 알고리즘 요구 가 있어 야 할 때
4.3.2 서로 다른 시간 에 서로 다른 업무 규칙 을 적용 할 때
5.인 스 턴 스:정렬 은 우리 가 자주 접 하 는 알고리즘 으로 한 배열 의 정렬 을 실현 하 는 데 여러 가지 방법 이 있 습 니 다.즉,서로 다른 전략 을 사용 할 수 있 습 니 다.다음은 정렬 기능 의 전략 모델 에 대한 해결 방안 을 제시 했다.
5.1 실현 도표
5.2 코드 구현
/// <summary>
///
/// </summary>
public abstract class SortStratege
{
/// <summary>
///
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public abstract int[] Sort(int[] array);
}
/// <summary>
///
/// </summary>
public class BubbleSort : SortStratege
{
/// <summary>
/// ( )
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public override int[] Sort(int[] array)
{
//
for (int i = 0; i < array.Length; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[i] > array[j])
{
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
return array;
}
}
/// <summary>
///
/// </summary>
public class InsertSort : SortStratege
{
/// <summary>
/// ( )
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public override int[] Sort(int[] array)
{
//
int temp;
int i, j, n;
n = array.Length;
for (i = 1; i < n; i++)
{
temp = array[i];
for (j = i; j > 0; j--)
{
if (temp < array[j - 1])
array[j] = array[j - 1];
else
break;
array[j] = temp;
}
}
return null;
}
}
public class SortContext
{
private int[] m_Array;
private SortStratege m_Stratege;
/// <summary>
/// Context
/// </summary>
/// <param name="array"></param>
/// <param name="stratege"></param>
public SortContext(int[] array, SortStratege stratege)
{
m_Array = array;
m_Stratege = stratege;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public int[] Sort()
{
int[] result = m_Stratege.Sort(this.m_Array);
return result;
}
}
5.3 클 라 이언 트 코드
public class Program
{
public static void Main(Object[] args)
{
int[] array = new int[] { 12, 8, 9, 18, 22 };
//
SortStratege sortStratege = new BubbleSort();
SortContext sorter = new SortContext(array, sortStratege);
int[] result = sorter.Sort();
//
SortStratege sortStratege2 = new InsertSort();
SortContext sorter2 = new SortContext(array, sortStratege2);
int[] result2 = sorter.Sort();
}
}
이상 이 바로 본문의 전체 내용 입 니 다.여러분 께 참고 가 될 수 있 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.