设计模式

设计模式--代理模式(proxy pattern)

2019-03-22  本文已影响0人  二妹是只猫

模式介绍

定义与类型

** 优点**

适用场景

UML类图

Proxy-Pattern.png

模式代码

class RealSubject extends Subject{

    @Override
    void visit() {
        System.out.println("RealSubject");
    }
}
class ProxySubject extends Subject{
    private RealSubject realSubject;
    public ProxySubject(RealSubject realSubject){
        this.realSubject = realSubject;
    }
    @Override
    void visit() {
        //通过真实主题引用对象调用真实主题中的方法
        realSubject.visit();
    }
}
 public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        ProxySubject proxySubject = new ProxySubject(realSubject);
        proxySubject.visit();
    }

扩展

静态代理的代理类的对象在code阶段被创建出来(如上述代码所示),而动态代理通过反射机制动态生成代理类的对象。java给我们提供了一个便捷的动态代理接口InvocationHandler,实现该接口需要重写其调用方法invoke:

public class DynamicProxy implements InvocationHandler{
 //被代理的类引用
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return null;
    }
}

动态代理类

public class DyamicProxy implements InvocationHandler{
    //被代理的类引用
    private Object obj;

    public DyamicProxy(Object obj){
        this. obj = obj;
    }

    @Override
    public RealSubject invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //调用被代理类对象的方法
        Object reuslt = method.invoke(obj,args);
        return reuslt;
    }
}

修改客户端代码:

 public static void main(String[] args) {
        //真实主题类
        RealSubject realSubject = new RealSubject();
        //构造一个动态代理
        DyamicProxy proxy = new DyamicProxy(realSubject);
        //获取一个真实主题类的ClassLoader
        ClassLoader loader = realSubject.getClass().get ClassLoader();
        //动态构造一个代理类
        ProxySubject proxySubject = Proxy.newProxyInstance(loader, new Class[]{ProxySubject.Class},proxy);
        proxySubject.visit();
    }
上一篇 下一篇

猜你喜欢

热点阅读