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

    代理模式:

    核心作用:通过代理控制对对象的访问,可以详细访问某个对象的方法,在调用这个方法前置处理,调用这个方法后做后置处理。

    抽象角色:定义角色代理和真实角色的公共对外方法。

    真实角色:实现抽象角色,定义真实角色所需要的实现的业务逻辑,供代理角色调用。 关注真正的业务逻辑!

    代理角色:实现抽象角色,是真实角色的代理,通过真实角色的代理的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 将统一的流程控制放到代理角色中处理。

    安全代理:屏蔽对真实角色的直接访问。

    远程代理:通过代理类处理远程方法调用(RMI)

    延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象。

    分类: 静态代理 动态代理

    应用:

    JDK自带的动态代理

    javaassist字节码操作

    CGLIB(Code Generation Library)库的实现

    ASM(汇编底层使用指令,可维护性较差)

    静态代理的Demo:

    package com.wxisme.staticproxy;
    /**
     * 静态代理
     * @author Administrator
     *
     */
    public interface Star {
        void confer();
        
        void signContract();
        
        void sellTicket();
        
        void sing();
        
        void collectMoney();
        
    }
    
    class RealStar implements Star {
        @Override
        public void sellTicket() {
            System.out.println("售票");
        }
        @Override
        public void collectMoney() {
            System.out.println("收钱");
        }
        @Override
        public void confer() {
            System.out.println("面谈");
        }
        @Override
        public void signContract() {
            System.out.println("签合同");
        }
        @Override
        public void sing() {
            System.out.println("明星唱歌");
        }
    }
    
    class ProxyStar implements Star {
    
        private Star star;
        public ProxyStar(Star star) {
            this.star = star;
        }
        @Override
        public void sellTicket() {
            System.out.println("售票");
        }
        @Override
        public void collectMoney() {
            System.out.println("收钱");
        }
        @Override
        public void confer() {
            System.out.println("面谈");
        }
        @Override
        public void signContract() {
            System.out.println("签合同");
        }
        //调用真实角色的方法
        @Override
        public void sing() {
            star.sing();
        }
        
    }
    
    package com.wxisme.staticproxy;
    
    public class Client {
        public static void main(String[] args) {
            Star realStar = new RealStar();
            Star proxy = new ProxyStar(realStar);
            
            proxy.confer();
            proxy.signContract();
            proxy.sellTicket();
            proxy.sing();
            
            proxy.collectMoney();
        }
    }

    运行结果:

    面谈
    签合同
    售票
    明星唱歌
    收钱

    把静态代理改成动态代理:

    可以参考一下大神对Java动态代理的解释:http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html

                                                               http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

    package com.wxisme.dynamicproxy;
    
    public interface Star {
        void confer();
        
        void signContract();
        
        void sellTicket();
        
        void sing();
        
        void collectMoney();
        
    }
    
    class RealStar implements Star {
        @Override
        public void sellTicket() {
            System.out.println("售票");
        }
        @Override
        public void collectMoney() {
            System.out.println("收钱");
        }
        @Override
        public void confer() {
            System.out.println("面谈");
        }
        @Override
        public void signContract() {
            System.out.println("签合同");
        }
        @Override
        public void sing() {
            System.out.println("明星唱歌");
        }
    }
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class StarHandler implements InvocationHandler {
        private Star realStar;
        
        
        public StarHandler(Star realStar) {
            super();
            this.realStar = realStar;
        }
    
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            Object obj = null;
            
            
            //可以进行一系列的流程控制。
            
            System.out.println("售票");
            System.out.println("面谈");
            System.out.println("签合同");
            
            if(method.getName().equals("sing")) {
                obj = method.invoke(realStar, args);
            }
            System.out.println("收钱");
            
            return obj;
        }
    
    }
    
    package com.wxisme.dynamicproxy;
    
    import java.lang.reflect.Proxy;
    
    public class Client {
        public static void main(String[] args) {
            Star realStar = new RealStar();
            StarHandler handler = new StarHandler(realStar);
            Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), 
                    new Class[]{Star.class}, handler);
            
            
            proxy.sing();
            
        }
    }

    运行结果:

    售票
    面谈
    签合同
    明星唱歌
    收钱

  • 相关阅读:
    PyQt5-QComboBox控件使用
    PyQt5-按钮控件使用
    PyQt5-QTextEdit控件使用
    Ubuntu12.04下YouCompleteMe安装教程(部分)
    ubuntu下vim的简单配置
    VirtualBox下vim无法正常使用问题解决
    树莓派下ubuntu-mate中ssh服务的安装与开机后自启动
    水仙花小游戏
    C语言实现判断分数等级
    临时记录(不断更新)
  • 原文地址:https://www.cnblogs.com/wxisme/p/4550574.html
Copyright © 2011-2022 走看看