java代理模式之静态代理

简介:   作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等。所以了解代理模式对于个人的成长是不可避免的。

  作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等。所以了解代理模式对于个人的成长是不可避免的。

  在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。

原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6013461.html

    通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。 
 
     代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。

    代理模式示意结构图比较简单,一般可以简化为如下图所示,但是在现实中要复杂很多。

 
如下的场景来理解为什么采用聚合而不是继承调用:
public interface Moveable {
    void move();
    void stop();
}
public class Tank implements Moveable {
    public void move() {        
        System.out.println("Tank Move");
        try {
            Thread.sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }        
    }    
    public void stop() {       
        System.out.println("Tank stop");
    }    
}  
现在我们要增加一个功能,记录move方法的执行时间,不能修改源码。

方式1:采用继承

public class Tank1 extends Tank {
    public void move() {        
        System.out.println("time start");
        super.move();
        System.out.println("time end");
    }    
}  

再增加一个功能,记录move的执行前后的日志信息,不能修改源码。

public class Tank2 extends Tank {
    public void move() {        
        System.out.println("log start");
        super.move();
        System.out.println("log end");
    }    
}  
但是要是想先记录日志在记录时间,那么就要再创建一个类继承Tank1类。
要先记录时间再记录日志,就要再创建一个类继承Tank2类。
代理模式不采用继承模式,因为扩展性很差的。
 

方式二:采用聚合模式

public class TimeProxy implements Moveable {
    Moveable m;   
    public TimeProxy(Moveable m) {
        super();
        this.m = m;
    }
    public void move() {        
        System.out.println("time start");
        m.move();
        System.out.println("time end");
    }    
} 

public class LogProxy implements Moveable {
    Moveable m;   
    public LogProxy(Moveable m) {
        super();
        this.m = m;
    }
    public void move() {        
        System.out.println("log start");
        m.move();
        System.out.println("log end");
    }    
}

想添加日志功能

  public static void main(String[] args) throws Exception {
        Moveable t = new Tank();
        Moveable m=new LogProxy(t);
        m.move();
    }

想先日志再时间,直接在调用处进行组合,不需要创建新的类

public static void main(String[] args) throws Exception {
        Moveable t = new Tank();
        Moveable m=new LogProxy(t);
        Moveable s=new TimeProxy(m);
        s.move();
    }

如果要对Moveable接口中所有的方法加时间计算

public class TimeProxy implements Moveable {
    Moveable m;   
    public TimeProxy(Moveable m) {
        super();
        this.m = m;
    }
    public void move() {     
        this.before();
        m.move();
        this.after();     
   }
    @Override
    public void stop() {     
        this.before();
        m.stop();
        this.after();       
    }    
    public void before()
    {
        System.out.println("time start");
    }
    public void after()
    {
        System.out.println("time end");
    }
}

代理模式的优点

代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。
保护代理可以控制对真实对象的使用权限。

代理模式的缺点

由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

 

 

作者: intsmaze(刘洋)
老铁,你的--->推荐,--->关注,--->评论--->是我继续写作的动力。
微信公众号号:Apache技术研究院
由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
23 2
|
2天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
12 0
|
6天前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
22 11
|
7天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
1月前
|
Java API 开发者
Java代理模式——静态代理与动态代理
Java代理模式——静态代理与动态代理
27 1
|
2月前
|
设计模式 Java API
[Java]静态代理、动态代理(基于JDK1.8)
本篇文章主要是对静态代理和动态代理实现思路的简述,以示例为主,少涉及理论。 如果文中阐述不全或不对的,多多交流。
54 1
[Java]静态代理、动态代理(基于JDK1.8)
|
3月前
|
设计模式 Java
Java中的静态代理模式实现
静态代理是一种常见的设计模式,它可以在不改变原有类结构的情况下对其进行功能扩展。本文将介绍Java中的静态代理实现方式以及使用场景。
14 0
|
3月前
|
设计模式 Java
java中的jdk代理和cglib代理
在Java中,代理是一种设计模式,它允许一个对象(代理)控制对另一个对象(真实对象)的访问。Java中的代理主要分为两种类型:JDK(Java Dynamic Proxy)代理和CGLIB(Code Generation Library)代理。
|
Java 数据库连接 Spring
JAVA 代理模式不了解一下吗?
JAVA 代理模式不了解一下吗?
71 0
JAVA 代理模式不了解一下吗?