代理模式(Proxy Pattern)
Posted anpeiyong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式(Proxy Pattern)相关的知识,希望对你有一定的参考价值。
一、定义
某些情况下,一个对象 不适合 (或 不能) 直接引用 另一个对象,代理对象 可以起到 中介 作用;
二、组成
a,抽象角色:
通过 接口(或 抽象类) 声明 真实角色 的业务;
b,真实角色:
实现 抽象角色,
定义 真实角色 的业务逻辑,
供 代理角色 调用;
c,代理角色:
实现 抽象角色,是 真实角色的代理;
三、模式分类
a,静态代理:
1、定义:
由程序员创建(或 工具生成) 代理类的源码,再编译代理类;
所谓静态,指的是 程序运行前 已经存在代理类;
2、案例:
package com.an.designpattern; /** * 通过接口、抽象类 ,声明真实角色的业务 */ public interface User void say();
package com.an.designpattern;
/**
* 真实角色
*/
public class UserImpl implements User
public void say()
System.out.println("我是真实角色。。。");
package com.an.designpattern; /** * 代理角色 * 通过 构造器 将 真实角色 塞入 代理对象中; * 代理对象 还可以对 功能作扩展; */ public class UserProxy implements User private User user; public UserProxy() public UserProxy(UserImpl userImpl) this.user=userImpl; public void say() System.out.println("我是代理角色。。。"); user.say();
package com.an.designpattern; /** * 静态代理测试 */ public class StaticProxyTest public static void main(String[] args) UserProxy userProxy=new UserProxy(new UserImpl()); userProxy.say(); 结果: 我是代理角色。。。 我是真实角色。。。
b,动态代理:
1、定义:
代码实现阶段 不用关心代理类,程序运行时才指定哪个对象;
2、实现方式:
1.1 基于JDK的动态代理 实现 接口
A,在java.lang.reflect包下,提供了Proxy类、InvocationHandler接口,通过这2个可以生成JDK动态代理类、动态代理对象;
B,Proxy类
1.1.1 Proxy类提供创建动态代理类、动态代理对象的静态方法;
1.1.2 如果需要为一个或多个接口 动态地生成实现类(或 实例),可以使用Proxy类;
public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)
创建一个动态代理类所对应的Class对象,实现多个interfaces
ClassLoader 指定生成动态代理类的类加载器;
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
直接创建一个动态代理对象,该对象实现多个interfaces;
执行代理对象的每个方法时,都会被换成InvocationHandler对象的invoke方法;
以上是关于代理模式(Proxy Pattern)的主要内容,如果未能解决你的问题,请参考以下文章