zoukankan      html  css  js  c++  java
  • java设计模式--代理模式

    代理模式 proxy:为其他对象提供一种代理,并以控制对这个对象的访问,好比经纪人和明星之间的关系,经纪人就是明星的代理类。简单的就是在方法调用前后做处理,AOP思想,好处就是不改变原来类方法的基础上,动态的添加其他方法。

    代理模式的3个角色

    1.抽象角色2.真实角色

    3.代理角色

    1.静态代理

    首先要有两个角色

       真实角色

       代理角色

    实现同一个接口

    代理角色中包含真实角色的引用

    代理类调用被代理类的方法。

    2.动态代理---比较常用

    public interface People {
        
        
        void eat();
        
    
    }
    public class Zhangsan implements People {
    
        public void eat(){
    
            System.out.println("吃饭");
        }
    
    }

    代理类---需实现InvocationHandler 接口

    public class PorxyHandler implements InvocationHandler {
        
        People people = null;
        
        public PorxyHandler(People people) {
            this.people = people;
        }
    
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            this.before();
            method.invoke(people, args);
            this.after();
            return null;
        }
        
        private void before(){
            System.out.println("洗手");
        }
        
        private void after(){
            System.out.println("洗碗");
        }
    
    }
    public class Client {
        
        public static void main(String[] args) {
            People people = (People)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{People.class}, new ProxyHandler(new Zhangsan()));
            people.eat();
            
        }
    
    }

     代理所有   jdk自带动态代理,只能代理接口,代理类用cglib

    public interface People {
        
        
        public void eat();
        
        
    
    }
    public class Zhangsan implements People{
        
        public void eat() {
            System.out.println("吃东西");
        }
        
        
        public static void main(String[] args) {
            
            ProxyHandler handler = new ProxyHandler(new Zhangsan());
            
            People people = (People)handler.getProxy();
            
            people.eat();
            
        }
    
    }
    public class ProxyHandler implements InvocationHandler{
        
        
        private Object target;
        
        
        public ProxyHandler(Object target) {
            this.target = target;
        }
        
        
        public Object getProxy(){
            return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        }
        
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            before();
            Object object = method.invoke(target, args);
            after();
            return object;
        }
        
        
        public void before(){
            System.out.println("之前");
        }
        
        public void after(){
            System.out.println("之后");
        }
        
    
    }
  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/jentary/p/5910768.html
Copyright © 2011-2022 走看看