23 디자인 패턴, 12 장 : Java 템플릿 메소드 모드
정의 : 작업에서 알고리즘의 프레임 워크를 정의하고 서브 클래스가 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계를 재정의 할 수 있도록 일부 단계를 서브 클래스로 지연시킵니다.
유형 : 행동 패턴
클래스 다이어그램 :
실제로 템플릿 방법은 프로그래밍에서 자주 사용되는 패턴입니다. 먼저 예를 살펴 보겠습니다. 어느 날 프로그래머 A는 작업을 받았습니다. 정수 배열을 제공하고 배열의 숫자를 작은 것에서 큰 것으로 정렬 한 다음 정렬 된 결과를 인쇄합니다. 분석 후이 작업은 분류 및 인쇄의 두 부분으로 대략적으로 나눌 수 있습니다. 인쇄 기능은 구현하기 쉽기 때문에 정렬은 약간 번거 롭습니다. 그러나 A는 먼저 인쇄 기능을 완료하고 정렬 기능을 수행 할 다른 사람을 찾습니다.
Abstract Class AbstractSort { / *** 작은에서 큰* @param 배열로 정렬 배열* / Protected Abstract void sort (int [] array); public void showsortresult (int [] array) {this.sort (배열); System.out.print ( "정렬 결과 :"); for (int i = 0; i <array.length; i ++) {system.out.printf ( "%3s", 배열 [i]); }}}글을 쓰고 나서 방금 졸업하고 일을 시작한 동료를 발견했습니다. 그래서 나는 AbstractSort 클래스를 B에 주었고 B가 그것을 구현하기 위해 B를 썼습니다. B는 그것을 인수하여 보았다. 너무 간단했습니다. 10 분 안에 완료되었습니다. 코드는 다음과 같습니다.
Class ConcretEsort 확장 AbstractSort {@override Protected Void Sort (int [] array) {for (int i = 0; i <array.length-1; i ++) {selectSort (Array, i); }} private void selectSort (int [] array, int index) {int minvalue = 32767; // 최소값 변수 int Index = 0; // 최소값 인덱스 변수 int 온도; // (int i = index; i <array.length; i ++) {if (array [i] <minvalue) {// 최소값 minvalue = array [i]; // 최소 값을 저장하는 Indexmin = i; }} temp = 배열 [index]; // 두 개의 숫자 값을 바꾸어 배열 [index] = array [indexmin]; 배열 [indexmin] = temp; }}그것을 작성한 후에, 그것을 a에게 주면, A는 그것을 실행하기 위해 가져갑니다.
공개 클래스 클라이언트 {public static int [] a = {10, 32, 1, 9, 5, 7, 12, 0, 4, 3}; // 사전 설정 데이터 배열 public static void main (String [] args) {AbstractSort s = new Concretesort (); S.Showsortresult (A); }} 실행 결과 :
정렬 결과 : 0 1 3 4 5 7 9 10 12 32
정상적으로 실행됩니다. 자, 작업이 완료되었습니다. 맞습니다. 이것은 템플릿 메소드 패턴입니다. 직장에 방금 들어간 대부분의 졸업생들은 B와 비슷한 경험을 가져야합니다. 복잡한 작업은 회사의 위대한 사람들이 작성한 다음 더 간단한 방법을 추상화에 작성하여 다른 동료에게 넘겨주기 위해 개발합니다. 이 노동 부서는 종종 비교적 명백한 프로그래머를 가진 회사에서 사용됩니다. 예를 들어, 프로젝트 팀에 건축가, 선임 엔지니어 및 주니어 엔지니어가있는 경우, 건축가는 일반적으로 많은 수의 인터페이스와 추상 클래스를 사용하여 전체 시스템의 논리를 결합하고 구현 코딩은 어려움에 따라 선임 엔지니어 및 주니어 엔지니어에게 양도됩니다. 어떻습니까, 템플릿 메소드 모드를 사용 했습니까?
템플릿 방법 패턴의 구조
템플릿 메소드 패턴은 상속 구조를 통한 추상 클래스 및 A (또는 그룹) 구현 클래스로 구성됩니다. 추상 클래스의 방법은 세 가지 유형으로 나뉩니다.
초록 방법 : 부모 클래스는 선언하지만 구현하지는 않지만 사양을 정의한 다음 하위 클래스로 구현합니다.
템플릿 방법 : 추상 클래스별로 선언 및 구현. 일반적으로, 템플릿 메소드는 초록 방법을 호출하여 주요 논리적 함수를 완성하고 템플릿 메소드는 대부분 최종 유형으로 정의되며, 이는 주요 논리적 함수를 서브 클래스로 다시 작성할 수 없음을 나타냅니다.
후크 방법 : 초록 클래스별로 선언 및 구현. 그러나 서브 클래스는 확장 될 수 있으며 서브 클래스는 후크 방법을 확장하여 템플릿 방법의 논리에 영향을 줄 수 있습니다.
추상 클래스의 과제는 추상 클래스의 품질이 프로그램이 안정인지 직접 결정하기 때문에 일반적으로 숙련 된 직원이 작성하는 논리적 프레임 워크를 구축하는 것입니다.
구현 클래스는 세부 사항을 구현하는 데 사용됩니다. 추상 클래스의 템플릿 메소드는 클래스 확장 방법을 구현하여 비즈니스 로직을 완료합니다. 구현 클래스의 확장 방법이 단위 테스트를 통과하는 한, 전체 함수는 일반적으로 템플릿 메소드가 올바른다는 전제에 큰 오류가 없습니다.
템플릿 메소드의 장점 및 적용 가능한 시나리오
확장하기 쉽습니다. 일반적으로 말하면, 추상 클래스의 템플릿 메소드는 반대로 변경하기 쉽지 않은 부분이며, 추상 방법은 반대로 변경하기 쉬운 부분입니다. 따라서 구현 클래스를 추가함으로써 일반적으로 개방 및 폐쇄 원리를 준수하는 기능을 쉽게 확장 할 수 있습니다.
유지하기 쉽습니다. 템플릿 메소드 모드의 경우, 주요 로직이 템플릿 메소드를 사용하는 것과 동일하기 때문에 정확하게입니다. 템플릿 메소드가 사용되지 않으면 동일한 코드를 혼란으로 유지하는 것이 매우 불편합니다.
더 유연합니다. 후크 방법이 있으므로 서브 클래스의 구현은 부모 클래스에서 기본 논리의 작동에도 영향을 줄 수 있습니다. 그러나 유연하지만 서브 클래스는 상위 클래스에 영향을 미치기 때문에 Richter 교체 원칙을 위반하면 프로그램에 위험을 초래할 수 있습니다. 이것은 추상 클래스의 설계에 더 높은 요구 사항을 부여합니다.
다중 서브 클래스가 동일한 방법을 갖고 메소드가 논리적으로 동일하면 템플릿 메소드 패턴을 사용하는 것을 고려할 수 있습니다. 이 모드는 프로그램의 기본 프레임 워크가 동일하고 세부 사항이 다를 때 프로그램을 사용하는 데에도 적합합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.