среда, 1 августа 2012 г.

pattern: Template Method

    Назначение
    Шаблонный метод определяет основу алгоритма и позволяет подклассам переопределить некоторые шаги алгоритма, не изменяя его структуру в целом.


    Использование шаблона в 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();
    }

    ....    
}