标签:模式分类 分类 直接 静态 作用 oca loader under get
一、定义
某些情况下,一个对象 不适合 (或 不能) 直接引用 另一个对象,代理对象 可以起到 中介 作用;
二、组成
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方法;
标签:模式分类 分类 直接 静态 作用 oca loader under get
原文地址:https://www.cnblogs.com/anpeiyong/p/11509259.html