基本要素
- 原始对象:需要被代理的对象,核心功能;
- 附加对象:用于修饰原始对象的附加功能;
- 代理对象:融合原始对象与附加对象
相关类
UserDao
package com.yusian.dao;
import com.yusian.domain.User;
public interface UserDao {
void register(User user);
boolean login(String username, String password);
}
UserDaoImpl
package com.yusian.dao;
import com.yusian.domain.User;
public class UserDaoImpl implements UserDao{
@Override
public void register(User user) {
System.out.println("UserDaoImpl.register-----核心功能实现");
}
@Override
public boolean login(String username, String password) {
System.out.println("UserDaoImpl.login-----核心功能实现");
return false;
}
}
UserDaoProxy
package com.yusian.dao;
import com.yusian.domain.User;
public class UserDaoProxy implements UserDao{
private UserDao userDao = new UserDaoImpl();
@Override
public void register(User user) {
System.out.println("UserDaoProxy.register---附加功能,比如打印日志");
userDao.register(user);
}
@Override
public boolean login(String username, String password) {
System.out.println("UserDaoProxy.login---附加功能,比如打印日志");
return userDao.login(username, password);
}
}
调用及结果
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.yusian.dao.UserDaoProxy"/>
</beans>
测试代码
public class ProxyTest {
@Test
public void staticProxyTest() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDaoProxy userDao = (UserDaoProxy) ctx.getBean("userDao");
userDao.register(new User());
}
}
输出结果
UserDaoProxy.register---附加功能,比如打印日志
UserDaoImpl.register-----核心功能实现
Process finished with exit code 0
总结
- 简单的静态代理类似组合,代理对象实现与原始对象相同的接口;
- 将原始对象做为代理对象的成员,核心功能的实现是直接调用原始对象的方法;
- 在调用原始对象方法之前,调用附加功能,实现功能的追加;
- 优点是不需要修改原有的类,实现了功能的扩展;
- 缺点是原始对象与代理对象一一对应,不够灵活,因此有一定的局限性;
Pingback: Proxy与CGLib实现动态代理 | 年年有"余"