zoukankan      html  css  js  c++  java
  • 代理(proxy)

    意图:为其他对象提供一种代理以控制对这个对象的访问

    结构

          image

    或者

    image

    .静态代理

    举个简单的例子,首先定义一个Ihello接口

    代码

    ihello.java

    public interface Ihello {
        public void hello(String name);
    }

    然后让实现业务逻辑的HelloSpeaker类实现Ihello接口,HelloSpeaker.java代码如下

    HelloSpeaker.java

    public class HelloSpeaker implements Ihello{
        public void hello(String name){
              System.out.println("hello,"+name);
        }
    }

    可以看到,在HelloSpeaker类中没有任何日志的代码插入其中,日志服务的实现将被放到代理类中,代理类同样要实现Ihello接口:


    HelloProxy.java

    import java.util.logging.*;
    public class HelloProxy implements Ihello{
        private Logger logger=Logger.getLogger(this.getClass().getName());
        private Ihello helloObject;
        public HelloProxy(Ihello helloObject){
                this.helloObject=helloObject;
        }
        public void hello(String name){
            log("hello method starts…");                 // 日志服务
             helloObject.hello(name);                    // 执行业务逻辑
            log("hello method ends…");                     // 日志服务
        }
        private void log(String msg){
            logger.log(Level.INFO,msg);
        }
    }

    在HelloProxy类的hello()方法中,真正实现业务逻辑前后可以安排记录服务,可以实际撰写一个测试程序来看看如何使用代理类。

    proxydemo.java

    public class ProxyDemo {
        public static void main(String[] args){
            Ihello proxy=new HelloProxy(new HelloSpeaker());
            proxy.hello("Justin");
        }
    }

    运行结果:

    image

    应用场合:

    1.远程代理

    2.虚代理

    3.保护代理

    4.只能引用

    补充动态代理

    动态代理指的是通过一个代理对象来创建需要的业务对象,然后在这个代理对象中统一进行各种需求的处理
    1、写一个类实现相应的InvocationHandler接口
    2、创建要代理的对象

    动态代理可以将一些横切性的问题(日志管理,权限控制)提取出来成为一个模块,之后在运行的时候根据需要切入到原有正常代码中。
    步骤:
    1、 创建动态代理类
    创建一个类实现InvocationHandler接口。以后创建对象就完全通过这个代理类来进行创建
    2、在代理类创建相应的要代理的对象

    image

    3、创建一个静态的newInstance方法来创建代理对象

    image

    4、创建了代理对象之后,这个代理对象在执行任何方法时都会先执行invoke方法,就可以在这个方法中加入控制信息

    image

    5 、根据以上步骤之后,日志管理就被提取成为一个独立的模块,在运行时进行加入


    6、由于使用的newInstance这个static的方法注入对象,所以无法使用Annotation需要使用xml的配置文件

    image
     
    7、此时可以考虑为相应的方法增加Annotation来增强相应的操作

  • 相关阅读:
    「Codeforces 724F」Uniformly Branched Trees
    「笔记」组合入门题选做
    「算法笔记」组合入门与应用
    「算法笔记」可持久化线段树
    「算法笔记」期望 DP 入门
    「NOIP 2016」换教室
    「算法笔记」基础数论
    「笔记」关于乱搞
    python 的列表遍历删除
    Python基础第三篇:函数
  • 原文地址:https://www.cnblogs.com/elite-2012/p/4336116.html
Copyright © 2011-2022 走看看