문제

할 수 있는 사람이 알려 몇 가지 예를 들어 상황 방법 템플릿 패턴이 사용되어야 하는가?

나에게 일부는 실제 사용에서 당신의 자신의 경험이다.

(나는 지금까지 발견 유용한 그것에 대해서만 데이터를 매핑에서 다층이다.죄송합니다!!!)

도움이 되었습니까?

해결책

나는 당신에게 실제 예제와 템플릿 방법 패턴을 사용해야하는 몇 가지 일반적인 상황을 주려고 노력했습니다.

  • 프로그램이 "확장을 위해 열려"하고 "수정을 위해 닫히십시오"를 원할 때. 이는 모듈의 동작을 확장 할 수있어서 모듈이 응용 프로그램 변경의 요구 사항으로 새롭고 다른 방식으로 행동하거나 새로운 애플리케이션의 요구를 충족시킬 수 있음을 의미합니다. 그러나 그러한 모듈의 소스 코드는 침해됩니다. 아무도 소스 코드를 변경할 수 없습니다. 다음 예에서는 이전 코드를 변경하지 않고도 새로운 급여 계산 방식 (원격 클래스)을 추가 할 수 있습니다.

    public abstract class Salary {
    
       public final void calculate() {
            System.out.println("First shared tasks is done.");
            getBaseSalary();
            System.out.println("Second shared tasks is done.");
       }
    
       public abstract void getBaseSalary();
    
    }
    
    public class Hourly extends Salary {
    
        @Override
        public void getBaseSalary() {
            System.out.println("Special Task is done.");
        }
    
    }
    
    public class Test {
    
        public static void main(String[] args) {
            Salary salary = ....
            salary.calculate();
        }
    }
    
  • 알고리즘의 일부 단계 만 연기하여 복제 된 동일한 코드 라인에 직면 할 때. 메소드 또는 기능의 컨텐츠를 구현할 때 코드의 일부 섹션을 찾을 수 있습니다. 이 섹션의 기능은 알고리즘의 (메소드 또는 함수) 기본 구조를 변경하지 않고 메소드 또는 기능의 이러한 섹션을 재정의하거나 수정할 수 있다는 것입니다. 예를 들어이 패턴 없이이 문제를 해결하려면이 샘플에 직면하게됩니다.

function0 : function1 : ... functionn :

1       1               1
2       2               2
...     ...             ...
5       6               n
3       3               3
4       4               4
...     ...             ...

보시다시피, 섹션 대구 5, 6, N은 하나의 함수마다 다르지만 복제 된 1,2,3,4와 같은 섹션을 공유했습니다. 유명한 Java 라이브러리 중 하나가있는 솔루션을 고려해 봅시다.

public abstract class InputStream implements Closeable {

    public abstract int read() throws IOException;

    public int read(byte b[], int off, int len) throws IOException {
        ....

        int c = read();
        ....
    }

    ....

}

public class ByteArrayInputStream extends InputStream {  

    ...

    public synchronized int read() {
        return (pos < count) ? (buf[pos++] & 0xff) : -1;
        }
    ...
}
  • 프레임 워크의 디자이너 인 경우 고객이 프레임 워크에 인수로 전달되는 실행 가능한 모든 코드를 사용하기를 원하며, 이는 주어진 시간에 해당 주장을 호출 (실행) 할 것으로 예상됩니다. 이 실행은 동기 콜백에서와 같이 즉각적 일 수 있거나 나중에 비동기 콜백에서와 같이 발생할 수 있습니다. 유명한 사람 중 하나를 고려해 봅시다.

    public abstract class HttpServlet extends GenericServlet 
        implements java.io.Serializable  {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
            ...
        }
    
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
            ....
            doGet(req, resp);
            ...
        }
        ...
    }
    }
    
    public class MyServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    
                //do something
            ...
        }
        ...
    }
    

다른 팁

템플릿 메소드 패턴 모든 종류의 알고리즘 또는 작업을 수행하기위한 골격을 제공하며 하위 클래스가 논리의 일부를 다시 정의 할 수 있습니다.

장점 : 프레임 워크 구축에 자연스럽게 적합하므로 학부모 프레임 워크 클래스가 어린이에서 구현 된 방법으로 콜백을 할 수 있습니다.

예 :

  • java.util.abstractlist
  • 서블릿의 doget 및 dopost 방법
  • MDB의 onmessage 메소드
  • struts 액션 클래스
  • Spring의 데이터 액세스 클래스

단점 : Java의 단일 상속으로 당신을 제한합니다.

적용 템플릿 메소드 패턴에는 두 가지 주요 특성이 있습니다.

  1. 기본 클래스가 있습니다 (Java, 하나만 protected 생성자 및 선택적으로 다음과 같이 선언했습니다 abstract) 클라이언트 코드에서 서브 클래싱됩니다.
  2. 거기 있습니다 두 그룹의 방법 기본 클래스에서 정의 : A) 하나 이상 템플릿 방법 (일반적으로 하나만) 하나 이상 원시 작동 방법 (일반적으로 하나 이상). 각 템플릿 메소드는 기본 클래스 자체에서 원시 작업 측면에서 구현 된 높은 레벨 작동을 나타내며, 이는 각 특정 서브 클래스에서 구현/재정의됩니다. 일반적으로 템플릿 메소드는 공개적이고 볼 수 없습니다 (final, Java); API 문서는 어떤 원시 작동 방법이 호출되는지, 그리고 (즉, "알고리즘"을 설명 해야하는지 정확하게 지정해야합니다). 알고리즘의 단계를 나타내는 원시 작동 방법은 비공개이지만 우선적이어야합니다 (protected, Java), 그리고 두 가지 유형 일 수 있습니다 : a) 추상 방법 ~ 해야 하다 서브 클래스로 구현됩니다. b) 기본/빈 구현이있는 메소드 5월 서브 클래스에서 재정의하십시오.

Java 6 SDK의 좋은 예는 다음과 같습니다. execute() 방법의 방법 javax.swing.SwingWorker 클래스 (a public final void 방법). 이 경우 원시 작동 방법은 다음과 같습니다 doInBackground(), process(List), 그리고 done(). 첫 번째는 추상적이므로 서브 클래스에서 구현이 필요합니다. 배경 스레드에서 템플릿 메소드에 의해 호출됩니다. 다른 두 개는 빈 구현이 있으며 하위 클래스에서 선택적으로 재정의 될 수 있습니다. EDT (스윙 이벤트 디스패치 스레드)에서 처리 중 및 끝에서 UI에 대한 업데이트를 허용합니다.

내 경험상, 나는 때때로이 패턴을 사용했습니다. 그러한 경우 중 하나는 Java 기본 클래스가 java.util.Iterator 인터페이스, 여기 next() 템플릿 메소드였으며 특정 도메인 엔티티 클래스를 인스턴스화하는 데 도움이되는 원시 작동 방법은 하나뿐이었습니다 (JDBC를 사용하여 지속적인 도메인 엔티티 개체 목록을 반복 할 때 사용해야 함). 동일한 애플리케이션의 더 나은 예는 템플릿 방법이 주어진 지속적인 엔티티 목록에서 "비즈니스 엔티티 유지 보수 화면"(스윙 사용)을 채우기위한 다중 단계 알고리즘을 구현 한 기본 클래스였습니다. 원시 작업 방법은 1) 현재 화면 상태를 지우고 2) 화면 내부의 테이블보기에 엔티티를 추가했습니다. 선택적으로 화면을 편집 할 수있는 경우 템플릿 메소드에서 다른 원시 작업이 호출되었습니다.

결국, 나는 이것이 확실히 유용한 디자인 패턴이지만, 실제로 적용 가능한 상황이 발생하지는 않다고 말해야합니다. 서브 클래스 (내 경험상 훨씬 더 일반적인 상황)에서 재정의되는 메소드가있는 기본 클래스를 갖는 것만으로는 그 자체로 패턴의 적용 자격이 충분하지 않습니다.

템플릿 방법에서 가장 중요한 것은 일련의 추상 방법을 단계 나 알고리즘으로 정의하고 하위 클래스가 해당 방법의 구체적인 구현으로 대체해야한다는 것입니다.

문서 생성 프로그램 중 하나에 적용했습니다.

public abstract DocumentGenerator() 
{
   generateHeader();
   generateBody();
   generateDetails();
}
public HTMLDocGenerator : DocumentGenerator()
{
   public override generateBody()
   {
     //generate as in html format
   }
}

PDF 생성기 CSV 생성기와 같은 다른 구현을 가질 수 있으며 여기의 값은 알고리즘 (생성 -> 헤더, 본문, 세부 사항)을 구성하는 것입니다.

구현이 많은 알고리즘이있을 때는 템플릿 패턴을 사용해야합니다. 알고리즘은 기본 클래스의 함수에 정의되며 구현은 기본 클래스 및 서브 클래스에 의해 수행됩니다. 실시간 예제에 대한 자세한 설명이 http://preciselyconcise.com/design_patterns/templatemethod.php

나는 스케치에 하나는 실제 예는 내용 일부 템플릿 방법이 있습니다.

에서는 C++컴퓨터 비전 알고리즘 응용 프로그램 알고리즘의 동작하도록 설계되었다고 가정부의 풍미를 알고리즘의 행동에 따라 몇 가지 옵션을 읽을 실행할 시간에 따른 열거로 자리 잡고 설정파일드에서 시작합니다.전체 골격 알고리즘을 제외하고는 동일한 핵심 콜백 박제의 중간에 무엇이 될 수 있는 동일한 섹션의 코드는 것이 잔인하게 중복을 호출의 다른 기능을에서는 수준입니다.이러한 콜백을 사용하고 싶었었으로 추상화된 방법 템플릿 기본 클래스와 방법 템플릿 패턴을 방지하는 모든 코드를 제공합니다.열거가 우리 사용되는 기본적으로 어떤 지시 서브 클래스가 인스턴스화 내 기본 클래스 포인터가 가리키고 따라서 빌려주는 알고리즘에 관련된 맛의 비트는 동작.

지금의 일부 동기 뒤에 이의 다양한 맛의 실행하는 알고리즘 온라인 vs 오프라인 기능을 하는 소프트웨어의 통제 우리의 악기입니다.오프라인 맛을 뽑아 그것으로 풍부한 디버/는 진단 출력 및 유지 좌표계 지역 일부 이미지는 픽셀의 온라인 맛을 유지하는 것에 절대적인 공간 좌표하고 유지 관한 특정을 실행하는 계기 모든 로봇 및 무엇인지 않습니다.다른 열거를 운전 중에서 선택 세트의 분류는 우리가 사용 일부에 대한 기계 학습뿐만 아니라 이후 다른 분류에서 훈련을 했다 다른 세트의 데이터는 그렇지 않으면 흘러 동일하게 본문을 통해 코드의 것 다르게 해석에 따라 일부 규제 조건에 대한 데이터를 만들었습니다.

저는 이것을 믿는 종류 사용의 경우 난에서 일어나 무엇이라고 불렀 중간에 구멍이 문제입니다.

여러 구성 요소가 동일한 프로세스를 공유했지만 구현은 약간 다릅니다.

템플릿 메소드는 알고리즘의 골격 구조를 정의하지만 특정 단계와 세부 사항을 서브 클래스로 정의합니다. 알고리즘의 구조와 흐름은 정적으로 유지되지만 단계의 세부 사항은 서브 클래스로 연기됩니다.

템플릿 메소드 패턴을 사용하여 문서 내용을 준비했습니다. 각 유형에 자체 작은 수정이있는 여러 종류의 문서가있었습니다. 그러나 문서 준비의 주요 과정은 모두와 동일했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top