代理(proxy)

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

结构

     

或者

.静态代理

举个简单的例子,首先定义一个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");
    }
}

运行结果:

应用场合:

1.远程代理

2.虚代理

3.保护代理

4.只能引用

补充动态代理

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

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

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

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

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

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


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

时间: 2024-10-13 12:08:30

代理(proxy)的相关文章

Ubuntu Linux下通过代理(proxy)使用git上github.com

github.com,作为程序员的代码仓库,我们经常会用到.但有时候我们不能直接通过网络链接它,只能通过代理. 这里我有一台代理服务器,起初我以为在终端设置了代理环境就行了,其设置为在你的~/.bashrc里增加以下几行: export http_proxy="http://proxy-server:3128/" export https_proxy="http://proxy-server:3128/" export ftp_proxy="http://

java代理Proxy

首先是静态代理: 1 public class Test1 { 2 3 public static void main(String[] args) { 4 IA a = new APoxy(new A()); 5 a.doJob(); 6 } 7 8 } 9 //功能接口 10 interface IA{ 11 public void doJob(); 12 } 13 //委托类 14 class A implements IA{ 15 16 @Override 17 public void

代理(Proxy)和反射(Reflection)

前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了Object.defineProperty()方法来支持开发者去做JS引擎早就可以实现的事情.ES6添加了一些内建对象,赋予开发者更多访问JS引擎的能力.代理(Proxy)是一种可以拦截并改变底层JS引擎操作的包装器,在新语言中通过它暴露内部运作的对象,从而让开发者可以创建内建的对象.本文将详细介绍代

Linux与云计算——第二阶段 第一十一章:代理Proxy服务器架设—Squid代理服务器正向代理和客户端配置

Linux与云计算--第二阶段Linux服务器架设 第一十一章:代理Proxy服务器架设-Squid代理服务器正向代理和客户端配置 安装Squid 安装Squid来配置代理服务器. [1] 这是一个通用的转发代理配置 [[email protected] ~]# yum -y install squid [[email protected] ~]# vi /etc/squid/squid.conf # line 26: 添加一条新的ACL acl lan src 192.168.96.0/24

代理(Proxy)和反射(Reflection) (转)

转自:http://www.cnblogs.com/xiaohuochai/p/7268600.html 前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了Object.defineProperty()方法来支持开发者去做JS引擎早就可以实现的事情.ES6添加了一些内建对象,赋予开发者更多访问JS引擎的能力.代理(Proxy)是一种可以拦截并改变底层

设计模式 之代理(Proxy)模式

为什么这里要定义代理呢?所谓代理代理,当然就是你不想做的事,找别人去做,这就是代理.所以,当你写代码的时候,你想保持类的简单性.重用性,你就可以把事件尽量都交给其它类去做,自己只管做好自己的事.也就是SRP,单一职责原则.如果一个类关注的点过多,做的事情太多.这些事情不管是你直接做的,还是调用别的对象去完成的.这都不行,自己做这些事,那就会使类的功能复杂化,维护不方便.而过多地调用其它对象来完成一些事情,表面上看起来好像不错,实际上是过度耦合了.我们编写类的原则应该是追求高内聚,低耦合的.可能你

初识代理——Proxy

无处不在的模式——Proxy 最近在看<设计模式之禅>,看到代理模式这一章的时候,发现自己在写spring项目的时候其实很多时候都用到了代理,无论是依赖注入.AOP还是其他,可以说是无处不在. 于是自己便自己摸索写了一些小例子,当然也参考了网上其他博主的博客,毕竟小白一枚hhhhhh 进入正题: 图1-1:代理Proxy 代理模式现在主流的有两大类:1.JDK代理    2.CGLB代理 (JDK静态代理就不说了,网上很多都有,主要我觉得现在面向企业项目,静态代理局限性有点大,对于我而言可能就

(3)理解代理 proxy

var Class = function(){ var klass = function(){ this.init.apply(this,arguments); }; klass.prototype.proxy = function(func){ var self = this; return (function(){ return func.apply(self,arguments); }); }; klass.prototype.include = function(obj){ for(va

ExtJs4学习(七)数据代理Proxy

Ext数据代理我们介绍常用的五种 Ext.data.proxy.Ajax AjaxProxy(Ajax数据代理类)是你的应用程序中使用最广泛的获取数据的方式. 它使用AJAX请求来从服务器获取数据, 然后通常将它们放入 Store中. 让我们来看一个典型的配置. 这里我们为一个Store设置一个AjaxProxy代理. 首先我们准备好一个 Model: Ext.define('User', { extend: 'Ext.data.Model', fields: ['id', 'name', 'e

代理(Proxy)——对象结构型模式

代理模式的意图: 为其它对象提供代理,以控制对这个对象的访问.对一个对象进行访问控制的原因是为了我们在确实需要这个对象时才对它进行创建和初始化.有些对象创建的开销非常大,所以我们应该根据需要进行创建.Proxy则可以代替一个对象,并在需要时负责实例化这个对象.就像我们小学的时候总是欺负学习好的同学,让学习好的同学代替我们写作业,要不然我们放学就在路上堵着打他们,学习好的同学就乖乖的帮我们写作业,第二天到学校老师看了作业还表扬我们学习有进步呢.这就是一个很好的代理模式的例子. 代理模式的类图如下: