代理 模式 之 静态代理
关键字 代理类 目标类
静态代理:代理类 要与目标类实现一样的接口。
静态代理的思想是:
通过在代理类中重写接口中的方法,对目标类中重写的接口的方法进行增强。
代理类中需要有目标类的对象作为代理类的成员变量,通过在代理类中重写的接口的方法中使用目标类的对象调用目标类中的该重写方法,并在代理类中的该重写的方法中添加想要增强的功能的代码,来进行方法增强。
具体实现代码举例如下:
接口的代码为
//创建接口
public interface IUserDao {
//声明方法
public void save();
}
目标类的代码:
//目标类target
public class UserDao implements IUserDao {
@Override
public void save() {
System.out.println("目标类中的save()方法");
}
}
代理类的代码:
//代理类(静态代理)
public class UserDaoProxy implements IUserDao{
//声明私有化成员变量,创建接口的对象,并未初始化
private IUserDao userDao;
//通过构造方法,初始化成员变量.接收并保存目标对象
//创建代理类的对象时,通过该构造方法传递参数
public UserDaoProxy(IUserDao iuser){
this.userDao = iuser;
}
//重写save()方法,增强方法
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("开启事务管理");
userDao.save();//执行的是目标对象的方法
System.out.println("提交事务");
}
}
测试类代码:
//测试类
public class StaticProxyTest {
@Test
public void testStatiProxy() throws Exception {
//创建目标对象,这里体现了多态
IUserDao user = new UserDao();
//创建代理对象,接收目标对象
UserDaoProxy userDaoProxy = new UserDaoProxy(user);
//通过代理对象调用代理类中的方法(即为增强后的目标方法)
userDaoProxy.save();
}
}
总结:静态代理的优缺点
1)可以做到在不修改目标类的功能的前提下,对目标类进行功能扩展
2)缺点:
a.因为代理类,需要与目标类实现一样的接口,所以会有很多代理类,会造成类太多的情况。
b.一旦接口中增加方法,目标类与代理类都要进行维护。
解决的方案:可以使用动态代理。