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

pattern: Proxy

Назначение
    Является суррогатом другого объекта и контролирует доступ к нему.

Использование шаблона в JDK
(примеры частично взяты с этого ресурса)
    - java.lang.reflect.Proxy
    - Connection Pool для JDBC - пример кэширующего прокси

----------------------------------------------------------------
-------------------java.lang.reflect.Proxy-------------------

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

import static java.util.Arrays.asList;

public class ProxyTest {

    public static void main(String[] args) {
        List proxyList = wrapList(new ArrayList(), "add", "toString");
        proxyList.add(10);
        proxyList.add(20);
        proxyList.add(30);
        System.out.println(proxyList);
        proxyList.remove(1);
    }

    private static List wrapList(final List list,
                                 final String... allowedMethods) {
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(
                    Object proxy, Method method, Object[] args)
                    throws Throwable {
                if (asList(allowedMethods).contains(method.getName())) {
                    return method.invoke(list, args);
                } else {
                    throw new SecurityException("Access denied!");
                }
            }
        };
        return (List) Proxy.newProxyInstance(
                ProxyTest.class.getClassLoader(),
                new Class[]{List.class},
                handler);
    }
}