Назначение
Шаблонный метод определяет основу алгоритма и позволяет подклассам переопределить некоторые шаги алгоритма, не изменяя его структуру в целом.
(примеры частично взяты с этого ресурса)
- java.util.LinkedHashMap (put()/putAll() вызывают removeEldestEntry())
- javax.servlet.http.HttpServlet (service() вызывает doGet()/doPost()/...)
- java.util.AbstractList (addAll() вызывает add())
----------------------------------------------------------------
-----------------java.util.InputStream------------------
???
-----------------java.util.LinkedHashMap------------------
import java.util.*;
public class TemplateMethodTest {
public static void main(String[] args) {
LinkedHashMap<String, Integer> map
= new LinkedHashMap<String, Integer>() {
@Override
protected boolean removeEldestEntry(
Map.Entry<String, Integer> eldest) {
if (size() > 3) {
List<String> keys = new ArrayList<>(keySet());
String minKey = Collections.min(keys);
remove(minKey);
}
return false;
}
};
map.put("aaa", 0);
System.out.println(map);
map.put("xxx", 0);
System.out.println(map);
map.put("ttt", 0);
System.out.println(map);
map.put("bbb", 0);
System.out.println(map);
map.put("yyy", 0);
System.out.println(map);
map.put("ccc", 0);
System.out.println(map);
map.put("zzz", 0);
System.out.println(map);
}
}
----------------------------------------------------------------
------------- javax.servlet.http.HttpServlet ---------------
public abstract class HttpServlet ... {
protected void service(...) throws ... {
...
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
...
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
...
}
...
}
protected void doDelete(...) throws ... {
String protocol = req.getProtocol();
String msg = ...
if (protocol.endsWith("1.1")) {
resp.sendError(...);
} else {
resp.sendError(...);
}
}
...
}
----------------------------------------------------------------
------------------- java.util.AbstractList -------------------
public abstract class AbstractList<E> ... {
...
public boolean addAll(int index, Collection<? extends E> c) {
rangeCheckForAdd(index);
boolean modified = false;
for (E e : c) {
add(index++, e);
modified = true;
}
return modified;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
....
}
Шаблонный метод определяет основу алгоритма и позволяет подклассам переопределить некоторые шаги алгоритма, не изменяя его структуру в целом.
Использование шаблона в JDK
(примеры частично взяты с этого ресурса)
- java.util.LinkedHashMap (put()/putAll() вызывают removeEldestEntry())
- javax.servlet.http.HttpServlet (service() вызывает doGet()/doPost()/...)
- java.util.AbstractList (addAll() вызывает add())
----------------------------------------------------------------
-----------------java.util.InputStream------------------
???
-----------------java.util.LinkedHashMap------------------
import java.util.*;
public class TemplateMethodTest {
public static void main(String[] args) {
LinkedHashMap<String, Integer> map
= new LinkedHashMap<String, Integer>() {
@Override
protected boolean removeEldestEntry(
Map.Entry<String, Integer> eldest) {
if (size() > 3) {
List<String> keys = new ArrayList<>(keySet());
String minKey = Collections.min(keys);
remove(minKey);
}
return false;
}
};
map.put("aaa", 0);
System.out.println(map);
map.put("xxx", 0);
System.out.println(map);
map.put("ttt", 0);
System.out.println(map);
map.put("bbb", 0);
System.out.println(map);
map.put("yyy", 0);
System.out.println(map);
map.put("ccc", 0);
System.out.println(map);
map.put("zzz", 0);
System.out.println(map);
}
}
----------------------------------------------------------------
------------- javax.servlet.http.HttpServlet ---------------
public abstract class HttpServlet ... {
protected void service(...) throws ... {
...
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
...
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
...
}
...
}
protected void doDelete(...) throws ... {
String protocol = req.getProtocol();
String msg = ...
if (protocol.endsWith("1.1")) {
resp.sendError(...);
} else {
resp.sendError(...);
}
}
...
}
----------------------------------------------------------------
------------------- java.util.AbstractList -------------------
public abstract class AbstractList<E> ... {
...
public boolean addAll(int index, Collection<? extends E> c) {
rangeCheckForAdd(index);
boolean modified = false;
for (E e : c) {
add(index++, e);
modified = true;
}
return modified;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
....
}