代理模式

2018-06-14  本文已影响0人  知_秋_
/**
 * 码农接口(抽象角色)
 */
public interface Coder {
    // 码农可以编码
    void develop(String demandName);
}
/**
 * java码农
 */
public class JavaCoder implements Coder {
    /**
     * java码农编码接口
     */
    @Override
    public void develop(String demandName) {
      System.out.println("java码农进行编码...");
    }
}
/**
 * 码农代理类
 */
public class CoderProxy implements Coder {
    private Coder javaCoder = null;
    public CoderProxy(Coder javaCoder) {
        this.javaCoder = javaCoder;
    }
    @Override
    public void develop(String demandName) {
        if (demandName.startsWith("Add")) {
            // 不再接受新增功能的需求了
            System.out.println("No longer receiver 'Add' demand!");
            return;
        }
        javaCoder.develop(demandName);
    }
}
public class Client {
    public static void main(String[] args) {
        // 真实的java码农对象
        Coder realCoder = new JavaCoder();
        // 代理对象
        Coder proxyCoder = new CoderProxy(realCoder);
        // 通过代理访问对象
        proxyCoder.develop("Add new user");
    }
}
/**
 * 码农动态代理类
 * 通过实现InvocationHandler接口的方式实现动态代理类
 */
public class CoderDynamicProxy implements InvocationHandler {
    // 代理的实例
    private Coder coder;

    public CoderDynamicProxy(Coder coder) {
        this.coder = coder;
    }

    /**
     * 调用代理方法
     *
     * @param proxy
     * @param method 具体方法
     * @param args   具体方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before...");
        Object result = method.invoke(coder, args);
        System.out.println("after...");
        return result;
    }
    
}
/**
 * 客户端
 */
public class Client2 {

    /**
     * 使用码农动态代理类
     * @param args
     */
    public static void main(String[] args) {
        // 要代理的码农对象
        Coder coder = new JavaCoder();
        // 动态代理代理类
        InvocationHandler handler = new CoderDynamicProxy(coder);
        // 动态生成一个代理类,该代理类对所有方法进行了代理
        Coder proxy = (Coder)Proxy.newProxyInstance(coder.getClass().getClassLoader(), coder.getClass().getInterfaces(), handler);

        proxy.develop("add");

    }

}
上一篇 下一篇

猜你喜欢

热点阅读