디자인 모델 실천 - 모든 인터페이스 실현 류 실천 공장 방법 에 반사 되 고 페이지 에 대량의 계산 데이터 가 있 을 때 디자인 실천
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 를 사용 하여 비동기 호출 을 하여 많은 계 산 량 을 전제 로 페이지 의 불 러 오 는 속도 와 전체 운행 효 과 를 유지 할 수 있 습 니 다.또한 특정한 데이터 의 읽 기와 계산 속 도 를 단독으로 테스트 하고 최적화 할 수 있 습 니 다. (실제 프로젝트 에서 저 는 계 산 량 이 비교적 많은 유형 에 대해 병행 계산 을 사 용 했 습 니 다)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.