代理模式-积木模式总结

无情 阅读:236 2021-05-02 14:53:53 评论:0

  代理模式-积木模式

  代理模式在实际开发中的确非常常见和常用,表面上代理模式是产生出一个代理类,作为访问实际实现类的代理,控制了外界对实际代理类的访问,在此基础上增加一些增强性的功能。实际上,还将实际实现作为一个粒度,将增强的部分功能分离解耦。

这里记录一下实现的一些代码:

静态代理:

public interface Subject { 
    void toilet(); 
} 
public class RealSubject implements Subject{ 
    public void toilet() { 
        System.out.println("toilet"); 
    } 
} 
/** 
 * 代理类控制了真实角色的访问权限 
 * 而从代理类自身增强的角度来看,可以说是控制了被代理功能的粒度细分的控制 
 */ 
public class SubjectProxy implements Subject{ 
 
    Subject subject =  new RealSubject(); 
 
    public void toilet() { 
        System.out.println("take my phone"); 
        subject.toilet(); 
        System.out.println("smell bad"); 
    } 
}

动态代理(java proxy):

public class ProxyHandler implements InvocationHandler { 
 
    private Object object; 
 
    public ProxyHandler() { 
    } 
 
    public ProxyHandler(Object object) { 
        this.object = object; 
    } 
 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
        System.out.println("take my phone"); 
        Object result = method.invoke(object,args); 
        System.out.println("smell bad"); 
        return result; 
    } 
} 
public class TestProxy { 
 
    public static void main(String[] args) { 
        Subject subject = new RealSubject(); 
        ProxyHandler proxyHandler = new ProxyHandler(subject); 
        Subject subjectProxy = (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(), 
                subject.getClass().getInterfaces(),proxyHandler); 
        subjectProxy.toilet(); 
    } 
}

动态代理(cglib):

public class CglibProxyInterceptor implements MethodInterceptor{ 
    public Object intercept(Object o, Method method, 
                            Object[] args, MethodProxy methodProxy) 
            throws Throwable { 
        System.out.println("take my phone"); 
        Object o1 = methodProxy.invokeSuper(o, args); 
        System.out.println("smell bad"); 
        return o1; 
    } 
} 
public class CglibProxyTest { 
    public static void main(String[] args) { 
        CglibProxyInterceptor cglibProxyInterceptor = new CglibProxyInterceptor(); 
        Enhancer enhancer = new Enhancer(); 
        enhancer.setCallback(cglibProxyInterceptor); 
        enhancer.setSuperclass(RealSubject.class); 
        Subject subject = (Subject)enhancer.create(); 
        subject.toilet(); 
 
    } 
}

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
KIKK导航

KIKK导航

关注我们