代理模式

简介: 一、代理模式简介   代理模式的作用是:为其他对象提供一种代理,以控制对这个对象的访问。在某种情况下,一个客户不想或者不能直接引用另一个对象,此时代理对象可以在客户端 和目标对象之间起到中介的作用。单例模式有如下特点: 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

一、代理模式简介

  代理模式的作用是:为其他对象提供一种代理,以控制对这个对象的访问。在某种情况下,一个客户不想或者不能直接引用另一个对象,此时代理对象可以在客户端 和目标对象之间起到中介的作用。单例模式有如下特点:

  • 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
  • 代理对象:可以在客户端和目标对象之前起到中介的作用,这样保护了目标对象
  • 高扩展性

  代理模式UML图如下:

二、代理模式实现

  代理模式一般涉及到的角色如下:

  • 抽象角色:声明真实对象和代理对象的共同接口
  • 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
  • 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象

  我们使用到JDK提供的代理类来实现动态代理。

  1、创建Subject接口(抽象角色)

1 package com.test.dynamicproxy;
2 
3 public interface Subject
4 {
5     public void request();
6 }

  2、创建RealSubject类(真实角色)

 1 package com.test.dynamicproxy;
 2 
 3 public class RealSubject implements Subject
 4 {
 5     public void request()
 6     {
 7         System.out.println("From real subject!");
 8     }
 9 
10 }

  3、创建DynamicSubject(该类用于产生代理对象)

 

 1 package com.test.dynamicproxy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 
 6 /**
 7  * 该代理类的内部属性是Object类型,实际使用的时候通过该类的构造方法传递进来一个对象
 8  * 此外,该类还实现了invoke方法,该方法中的method.invoke其实就是调用被代理对象的将要
 9  * 执行的方法,方法参数是sub,表示该方法从属于sub,通过动态代理类,我们可以在执行真实对象的方法前后 加入自己的一些额外方法。
10  * 
11  */
12 
13 public class DynamicSubject implements InvocationHandler {
14     private Object sub;
15 
16     public DynamicSubject(Object obj) {
17         this.sub = obj;
18     }
19 
20     // 以下的参数由底层传递。。。
21 
22     /**
23      *@param proxy 代理对象
24      * 
25      *@param method 要代理的方法
26      *
27      *@param args 该方法的参数对象数组
28      *
29      *@return
30      */
31     public Object invoke(Object proxy, Method method, Object[] args)
32             throws Throwable {
33         System.out.println("before calling: " + method);
34 
35         method.invoke(sub, args);// 掉用真实对象的方法,通过反射来调用
36 
37         System.out.println(args == null);//方法没有参数则为空
38 
39         System.out.println("after calling: " + method);
40 
41         return null;
42     }
43 
44 }

 4、调用类Client

 1 package com.test.dynamicproxy;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Proxy;
 5 
 6 public class Client {
 7     public static void main(String[] args) {
 8         // 创建真实对象
 9         RealSubject realSubject = new RealSubject();
10 
11         // 设置要被代理的对象
12         InvocationHandler handler = new DynamicSubject(realSubject);
13 
14         Class<?> classType = handler.getClass();
15 
16         // 下面的代码一次性生成代理对象
17         Subject subject = (Subject) Proxy.newProxyInstance(classType
18                 .getClassLoader(), realSubject.getClass().getInterfaces(),
19                 handler);
20 
21         subject.request();
22 
23         System.out.println(subject.getClass());
24     }
25 }

  5、运行结果如下:

目录
相关文章
|
6月前
结构型 代理模式
结构型 代理模式
39 0
|
21天前
|
设计模式 缓存 C#
C# 一分钟浅谈:装饰者模式与代理模式
【10月更文挑战第12天】本文介绍了面向对象编程中的两种常见设计模式:装饰者模式和代理模式。装饰者模式允许在运行时动态地给对象添加功能,而代理模式则通过代理对象控制对另一个对象的访问。文章详细讲解了这两种模式的概念、常见问题、如何避免问题以及代码示例,帮助读者更好地理解和应用这些设计模式。
35 13
|
4月前
|
设计模式
对于装饰器模式与代理模式的个人理解
摘要: 代理模式与装饰器模式虽相似,但目的不同。装饰器动态增强对象功能,如添加新特性,而不改变原有类。代理模式则用于控制访问,如优化昂贵操作或添加辅助服务(如日志),它可能在内部初始化原对象。用法上,装饰器由外部决定是否应用,允许链式创建,而代理通常内部调用,外部直接与代理交互,被代理对象可能独立不可用。
|
6月前
|
缓存 数据安全/隐私保护 C++
【C++】—— 代理模式
【C++】—— 代理模式
|
6月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
代理模式——为他人做嫁衣裳
代理模式——为他人做嫁衣裳
|
6月前
|
Java Spring
代理模式
代理模式
53 0
|
Java 网络安全 Maven
代理模式的运用
代理模式的运用
53 0
|
设计模式 JavaScript
关于代理模式我所知道的
关于代理模式我所知道的
80 0
|
Java Spring
代理模式你了解多少
代理模式你了解多少
76 0