静态代理在使用时,需要定义接口
或者父类
,目标对象与代理对象一起实现相同的接口
或者是继承相同父类
。
代理对象通过调用代理对象的方法来调用目标对象的方法;可以在不修改目标对象的前提下,对目标对象的功能进行扩展。
静态代理
静态代理实现核心:
在代理类里,定义一个目标对象的参数;在调用代理对象时,将目标对象做为代理对象构造方法里的参数传入,这样就可以在代理对象的方法里调用目标对象的方法,可以在代理方法里做一些扩展。在调用时,只需通过代理对象调用自身的方法即可。构成元素:
- 接口 或 父类
- 接口的实现类 或 继承父类的子类
- 实现同样接口的代理类 或 同样继承父类的代理类
实现接口方式
- 接口
/**
* 接口
*/
public interface UserDao {
void save();
}
- 目标对象类(接口实现类)
/**
* 目标对象
*
*/
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("正在保存");
}
}
- 代理对象类(实现同一个接口)
/**
* 代理对象
*
*/
public class UserDaoProxyImpl implements UserDao {
private UserDaoImpl userDaoImpl;
public UserDaoProxyImpl(UserDaoImpl userDaoImpl) {
this.userDaoImpl = userDaoImpl;
}
@Override
public void save() {
System.out.println("代理增强: 开始保存。。。。");
userDaoImpl.save();
System.out.println("代理增强: 保存结束。。。。");
}
}
- 调用代理类
public class ProxyMain {
public static void main(String[] args) {
UserDaoImpl userDaoImpl = new UserDaoImpl();
UserDaoProxyImpl userDaoProxyImpl = new UserDaoProxyImpl(userDaoImpl);
userDaoProxyImpl.save();
}
}
- 执行结果
代理增强: 开始保存。。。。
正在保存
代理增强: 保存结束。。。。
继承父类方式
- 父类
public class BaseDao {
public void save() {
System.out.println("正在保存。。。。");
}
}
- 目标对象类(继承父类)
/**
* 目标对象类
*
*/
public class UserDao extends BaseDao {
public void update() {
System.out.println("正在更新。。。。");
}
}
- 代理对象类(继承相同的父类)
/**
* 代理对象
* @author Rocky
*
*/
public class UserDaoProxy extends BaseDao {
private UserDao userDao;
public UserDaoProxy(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
System.out.println("代理增强: 开始保存。。。。");
userDao.save();
System.out.println("代理增强: 保存结束。。。。");
}
public void update() {
System.out.println("代理增强: 开始更新。。。。");
userDao.update();
System.out.println("代理增强: 更新结束。。。。");
}
}
- 调用代理对象
public class ProxyMain {
public static void main(String[] args) {
UserDao userDaoImpl = new UserDao();
UserDaoProxy userDaoProxy = new UserDaoProxy(userDaoImpl);
userDaoProxy.save();
System.out.println("------------------------------------");
userDaoProxy.update();
}
}
- 执行结果
代理增强: 开始保存。。。。
正在保存。。。。
代理增强: 保存结束。。。。
------------------------------------
代理增强: 开始更新。。。。
正在更新。。。。
代理增强: 更新结束。。。。
静态代理弊端
代理对象要与目标对象实现一样的接口,或继承同一个父类,若目标类很多的话,就要生成同样多的代理类;一旦接口或父类增加方法,目标对象和代理对象都要维护。
解决静态代理的弊端详见动态代理
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载