说明
eg:A叫B帮他带一份盒饭,A是委托人,B是代理人 代理模式:为了不再改变源代码的情况下增加功能,装饰器模式也是
分类
- 静态代理:指定某个类为代理类,必须要程序员写出这个类
- 动态代理:根据实际的情况在内存中自动生成代理类,代理对象,不需要自己写类
静态代理
规范:必须要有一个接口
示例:
interface Show{
public void sing();
}
class Singer implements Show{
@Override
public void sing() {
System.out.println("...忘情水");
}
}
//经纪人
class SingerProxy implements Show{
private Singer singer;
public SingerProxy(Singer singer) {
super();
this.singer = singer;
}
@Override
public void sing() {
System.out.println("先谈价格,谈妥之后");
singer.sing();
System.out.println("收钱");
}
}
动态代理-jdk代理
jdk中提供了动态代理的实现类,可以直接利用在内存生成代理对象
模拟数据库操作:
JDK代理: 1. 必须要有接口 2. 被代理类必须要实现接口 3.必须要创建一个代理工厂,用来动态的创建代理对象
```
interface IUser{
public void delete();
}
//被代理类(委托)dao class UserDao implements IUser{
@Override
public void delete() {
System.out.println("到数据库中删除指定的用户");
}
} //工厂类 class ProxyFactory{ //添加一个被代理对象的属性 private Object target; //委托目标 指向一个委托人
public ProxyFactory(Object target) {
super();
this.target = target;
}
//添加一个创建代理对象的方法
public Object getProxyInstance() {
//参数1:类加载器,写本类的就行
//参数2:接口的数组,写被代理类的实现的接口
//参数3:handler,写进增加的功能
return Proxy.newProxyInstance(
ProxyFactory.class.getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//参数1:自动生成的代理对象
//参数2:要执行的方法
//参数3:要指向方法的参数
System.out.println("开启一个事务");
//参数1:要写被代理对象
Object result = method.invoke(target, args);
//
System.out.println("提交事务");
return result;
}
});
}
}
public class jdkProxy {
public static void main(String[] args) {
UserDao dao = new UserDao();//委托人
ProxyFactory factory = new ProxyFactory(dao);
//生成代理对象
IUser proxy = (IUser)factory.getProxyInstance();
proxy.delete();
System.out.println(proxy);
}
}
```
程序运行结果:
开启一个事务
到数据库中删除指定的用户
提交事务
开启一个事务
提交事务
com.dyr.jdk.UserDao@28d93b30