2016-02-22 10 views
3

Я читаю о Template design pattern. В соответствии с моим нынешним пониманием шаблон шаблона шаблона может использоваться, когда у нас есть алгоритм с определенным набором процессов (методов), которые нужно выполнить по порядку. Главными игроками являютсяШаблон дизайна шаблона в JDK, не удалось найти метод, определяющий множество методов, которые должны быть выполнены в порядке

1. Abstract Template class, содержащий template method, определяющий процессы (методы) и порядок выполнения. Обычно этот метод делается окончательным, так как его поведение не изменяется. Немногие из процессов (методов), упомянутых в методе шаблона, имеют реализацию по умолчанию, а другие в зависимости от конкретных классов, расширяющих типы классов абстрактных шаблонов, остаются абстрактными.

2. Concrete classes extending the Template method. При необходимости они переопределяют методы по умолчанию и предоставляют реализацию абстрактных методов, определенных в классе Abstract Template.

Я попытался найти его реализацию в JDK, я просмотрел классы java.io после прочтения, что эти классы реализуют этот шаблон. Мне не удалось найти какой-либо метод, определяющий набор процессов (методов) и порядок выполнения.

Просьба предоставить ценные данные.

+0

Боюсь, я не совсем понимаю ... Вы хотите примеры шаблона дизайна шаблона в JDK, или вы хотите вид класса утилиты на языке, который позволяет вам применять шаблон шаблона для собственных классов? В этом последнем случае такой утилиты нет, поэтому вам нужно реализовать свои классы, которые моделируют шаблон шаблона. –

+0

@FedericoPeraltaSchaffner, я понимаю, что нет никаких классов полезности или методов для реализации шаблонов проектирования, мне нужны примеры шаблона шаблона в JDK. –

ответ

2

Простым примером является java.io.OutputStream.

template method является
public void write(byte b[], int off, int len).

Это вызывает абстрактный метод
public abstract void write(int b),
, которая должна быть реализована подклассом OutputStream.

В этом случае инвариантная часть шаблона является основной обработкой ошибок, которая является общей для каждого OutputStream, в то время как вариантная часть шаблона является фактической записью, которая специфична для каждой конкретной реализации.

Ваше понимание правильности рисунка; однако, это не обязательно должно быть сложным. В принципе, любой конкретный метод, который вызывает абстрактный метод в одном классе, является методом шаблона.

+0

Спасибо за ответ. После прочтения вашего ответа мне пришла в голову еще одна мысль. Если абстрактный класс вызывает любые абстрактные методы (или не абстрактный метод с реализацией по умолчанию, может быть переопределен, может быть не подкласс), это пример шаблона проектирования шаблона. Абстрактные классы имеют общее поведение, и любой метод, который имеет вызовы методам, определенным внутри него, является примером шаблона шаблона шаблона. Пожалуйста, исправьте мое понимание, если я ошибаюсь. Спасибо :) –

+1

Нет, конкретный метод, вызывающий другой конкретный метод в абстрактном классе, не является шаблоном. Вариантная часть шаблона, то есть вызываемый метод, является абстрактной в соответствии с шаблоном. – jaco0646

2

Чтобы быть более конкретным:

Non-абстрактные методы, требующие абстрактные методы в их реализации могут быть классифицированы как методы шаблона.

Template_method Определить программный скелет алгоритма в операции, отложив некоторые шаги к подклассам. Если вы определяете полную операцию как абстрактный метод, подклассы будут иметь полный контроль, чтобы изменить скелет алгоритма, и поэтому абстрактные методы не классифицируются как методы шаблона.

например. Reader класс в IO.

public int read() throws IOException { 
     char cb[] = new char[1]; 
     if (read(cb, 0, 1) == -1) // this is an abstract method 
      return -1; 
     else 
      return cb[0]; 
    } 

Здесь

abstract public int read(char cbuf[], int off, int len) throws IOException; является абстрактным методом.

Реализация этого метода можно найти в BufferedReader

public int read(char cbuf[], int off, int len) throws IOException { 

}