C\#디자인 모델 시리즈 튜 토리 얼-전략 모델

전략 모델 을 이야기 하기 전에 제 가 먼저 일상생활 의 예 를 들 어 수도 국제공항 에서 XXX 호텔 까지 어떻게 지나 갑 니까?1)호텔 픽업 서 비 스 를 직접 차 로 받 습 니 다.2)택시 타고 간다.3)공항 고속 철도+지하철 4)공항 버스 5)버스 6)걸 어가 기 등등.사용 방법,우 리 는 모두 공항 에서 XXX 호텔 까지 의 목적 을 달성 할 수 있 습 니 다.그 렇 죠?그러면 내 가 열거 한 공항 에서 XXX 호텔 까지 의 방법 은 바로 우리 가 선택 할 수 있 는 전략 이다.
다시 한 번 예 를 들 어 우리 가 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 전략 모델 의 일반 화 된 도표
//img.jbzj.com/file_images/article/201606/2016060111500833.png
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 실현 도표
//img.jbzj.com/file_images/article/201606/2016060111500834.png
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();
  }
 }
이상 이 바로 본문의 전체 내용 입 니 다.여러분 께 참고 가 될 수 있 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기