디자인 모델 실천 - 모든 인터페이스 실현 류 실천 공장 방법 에 반사 되 고 페이지 에 대량의 계산 데이터 가 있 을 때 디자인 실천

17682 단어 디자인 모드
평소에 개발 할 때 디자인 모델 을 자주 사용 합 니 다. 어떤 친구 들 은 평소에 일 할 때 사용 하 는 디자인 모델 의 실천 을 모두 기록 하고 공유 하 는 동시에 자신 을 격려 할 수 있 습 니 다. 자신의 디자인 이 더 잘 재 구성 할 수 있 는 지 반성 할 수 있 습 니 다.
지금 말씀 드 리 지만 저 는 지 정 된 인터페이스 류 를 실현 하 는 간단 한 공장 모델 을 반사 적 으로 얻 었 습 니 다. 이 유 는 제 가 재무 페이지 를 만들어 야 하기 때 문 입 니 다. 이 페이지 에서 43 개의 데 이 터 를 표시 해 야 합 니 다. 이 43 개의 데이터 의 출처 는 모두 각자 독립 된 것 이 고 대체적으로 특수 한 통계 와 집계 값 입 니 다.간단 한 생각 은 디자인 방법 이 하나의 유형 을 실현 하 는 것 이다. 이런 유형 에 43 가지 방법 을 쓰 는 것 이다. 이 43 가지 방법 에서 각자 의 계산 이 실현 되 고 수천 줄 이 가득 한 유형 을 쓰 는 것 이 매우 무 섭 지만 이런 방법 중의 알고리즘 은 문제 가 없다 는 것 을 확정 하고 얻 은 결 과 를 계산 하 는 것 도 정확 하 다.이어서 나 는 그것 을 재 구성 해서 그것 을 더욱 분명하게 했다.
그 다음 에 나 는 인 터 페 이 스 를 설계 했다. 이 인터페이스 에는 계산 방법 이 있 고 매개 변수 대상 을 받 았 다.이렇게 보 입 니 다.
   1: public class FinanceArg
   2: {
   3:     public double Year { get; set; }
   4:     public double Month { get; set; }
   5: }
   6:  
   7: public interface IFinance
   8: {
   9:     public double GetData(FinanceArg arg);
  10: }

현재 나 는 모든 계산 방법 을 IFinance 에서 계승 한 후에 그 중의 GetData 데 이 터 를 실현 한다.
이렇게 하면 사용자 가 하나의 방법 을 추가 해 야 할 때 하나의 종 류 를 직접 확장 할 수 있다. 만약 에 사용자 가 특정한 통계 방법 을 수정 해 야 할 때 도 하나의 종 류 를 다시 만 든 다음 에 고객 이 호출 을 수정 하면 된다.
   1: //    
   2: public class Income : IFinance
   3: {
   4:     public double GetData(FinanceArg arg)
   5: }
   6:  
   7: //    
   8: public class Payment : IFinance
   9: {
  10:     public double GetData(FinanceArg arg)
  11: }

그 다음 에 공장 류 를 설계 하여 이 대상 들 의 인 스 턴 스 를 실현 합 니 다. 저 는. NET 의 반사 방법 을 사 용 했 습 니 다. 클 라 이언 트 가 지정 한 클래스 이름 을 통 해 프로그램 에서 클래스 를 집중 적 으로 찾 은 다음 에 호출 했 습 니 다. 방법 은 다음 과 같 습 니 다.
   1: public static class FinanceFactory
   2: {
   3:     public static IFinance CreateInstance(string assembly, string typeName)
   4:     {
   5:         return (IFinance)Assembly.Load(assembly).CreateInstance(typeName);
   6:     }
   7: }

이렇게 해서 하나의 표준적 인 공장 방법 을 실현 하 였 는데, 원래는 여기까지 면 끝 날 것 이다.그러나 저 는 개인 적 으로 페이지 의 모든 태그 에 이 걸 사용 하 는 것 이 정말 번거롭다 고 생각 하여 다른 방법 을 생각 했 습 니 다.
(개인 실천)
먼저 프로그램 에서 지정 한 인 터 페 이 스 를 계승 한 모든 종 류 를 집중 적 으로 찾 아 캐 시 에 넣 고 호출 할 때 바로 꺼 냅 니 다.수정 후 다음 과 같 습 니 다:
   1: public class FinanceArg
   2: {
   3:     public double Year { get; set; }
   4:     public double Month { get; set; }
   5:     public string TypeName { get; set; }
   6: }
   7:  
   8: public static class FinanceFactory
   9: {
  10:     private static Dictionary<string, IFinance> _dataSourceDict;
  11:  
  12:     /// <summary>
  13:     ///                              
  14:     /// </summary>
  15:     public static FinanceFactory(string assemblyName, string interfaceName)
  16:     {
  17:         Assembly assembly = Assembly.Load(assemblyName);
  18:  
  19:         _dataSourceDict = GetInstanceByImplementsInterface<IFinance>(assembly, interfaceName)
  20:             .ToDictionary(type => type.GetType().Name);
  21:     }
  22:     /// <summary>
  23:     ///                
  24:     /// </summary>
  25:     /// <typeparam name="T"></typeparam>
  26:     /// <param name="assembly"></param>
  27:     /// <param name="interfaceName"></param>
  28:     /// <returns></returns>
  29:     private static IEnumerable<T> GetInstanceByImplementsInterface<T>(Assembly assembly, string interfaceName)
  30:     {
  31:         Type[] types = assembly.GetTypes();
  32:         TypeFilter myFilter = new TypeFilter((x, y) => x.ToString() == y.ToString());
  33:         foreach (Type type in types)
  34:             foreach (Type t in type.FindInterfaces(myFilter, interfaceName))
  35:                 yield return (T)assembly.CreateInstance(type.FullName);
  36:     }
  37:     /// <summary>
  38:     ///     
  39:     /// </summary>
  40:     /// <param name="arg"></param>
  41:     /// <returns></returns>
  42:     public static double GetTotal(FinanceArg arg)
  43:     {
  44:         if (_dataSourceDict.ContainsKey(arg.TypeName))
  45:             return _dataSourceDict[arg.TypeName].GetData(arg);
  46:  
  47:         return -1;
  48:     }

여기 서 저 는 매개 변수 에 인 스 턴 스 의 어떤 파 라 메 터 를 추 가 했 습 니 다. 클 라 이언 트 가 호출 할 때 실 현 된 클래스 에 들 어 갔 습 니 다. 이렇게 하면 또 결합 되 지 않 습 니까? 네, 그렇습니다. 하지만 이것 은 제 가 프론트 데스크 톱 에서 페이지 의 태그 이름과 일치 하기 때 문 입 니 다.프론트 페이지 의 태그 이름과 일치 하 는 이 유 는 무엇 입 니까? 프론트 페이지 의 태그 이름 이 AJAX 를 통 해 백 엔 드 의 동명 이인 을 자동 으로 호출 할 수 있 도록 하려 고 합 니 다. 이것 은 설정 보다 약속 한 실천 입 니 다. 저 는 페이지 의 태그 와 백 엔 드 의 클래스 에 이름 을 약속 하 게 하려 고 합 니 다. 그러면 프론트 데스크 에서 AJAX 를 사용 할 수 있 습 니 다.데이터 통 계 를 추가 해 야 할 때 페이지 에 span 라벨 을 추가 한 다음 에 클래스 에서 이 SPAN 이름과 같은 IFinance 클래스 를 계승 할 수 있 습 니 다. 시스템 은 이 두 가 지 를 자동 으로 일치 시 킨 다음 에 호출 할 수 있 습 니 다. 구체 적 인 코드 는 다음 과 같 습 니 다.
   1: <table>
   2:     <tr>
   3:         <td></td>
   4:         <td><span id="Income" class="remoting" /></td>
   5:     </tr>
   6:     <tr>
   7:         <td></td>
   8:         <td><span id="Payment" class="remoting" /></td>
   9:     </tr>    
  10: </table>
  11: <script type="text/javascript">
   1:  
   2:     $(".remoting").each(function(){
   3:         $(this).load("GetData.ashx", {year:'2011', month:'7', typeName=$(this).attr('id'), rnd:Math.random()});
   4:     });

페이지 의 대략적인 상황 은 이 렇 습 니 다. 물론 약속 은 자신 이 정의 한 것 입 니 다. 페이지 디자이너 와 약속 하면 됩 니 다. id 도 아니 고 특정한 attribute 일 수도 있 습 니 다.
그 중에서 GetData. ashx 는 훨씬 간단 합 니 다. AJAX 가 받 은 매개 변 수 를 Factory 에 직접 건 네 주 고 데 이 터 를 출력 하면 됩 니 다.
요약 하면 실제 프로젝트 에서 하나의 모델 을 억지로 옮 길 수 없 으 며 실제 프로젝트 에 따라 유연 하 게 운용 해 야 한다. 심지어 여러 가지 원칙 을 조합 하여 운용 할 수 있다.본 사례 에서 이러한 단일 직책 을 사용 하여 관심 사 를 분리 시 키 고 이런 원칙 을 배치 하 는 것 보다 약속 하 며 공장 모델 을 융합 시 켜 이 응용 을 실현 했다.프론트 데스크 는 AJAX 를 사용 하여 비동기 호출 을 하여 많은 계 산 량 을 전제 로 페이지 의 불 러 오 는 속도 와 전체 운행 효 과 를 유지 할 수 있 습 니 다.또한 특정한 데이터 의 읽 기와 계산 속 도 를 단독으로 테스트 하고 최적화 할 수 있 습 니 다. (실제 프로젝트 에서 저 는 계 산 량 이 비교적 많은 유형 에 대해 병행 계산 을 사 용 했 습 니 다)

좋은 웹페이지 즐겨찾기