zoukankan      html  css  js  c++  java
  • 代理模式-积木模式

      代理模式-积木模式

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

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

    静态代理:

    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();
    
        }
    }
  • 相关阅读:
    组件库设计
    kill 3000
    nextjs服务端渲染原理
    Web交互增强
    webpack4.0打包的时候一些技巧
    把网站部署到阿里云上的步骤
    typescript使用小结
    webpack 4.0尝鲜
    基于Quick-cocos2d-x的资源更新方案 二
    Android APK是否需要预解压
  • 原文地址:https://www.cnblogs.com/killbug/p/6438253.html
Copyright © 2011-2022 走看看