AOP:面向切面,原生思想来自代理模式的拓展,追溯源头设计模式的思想都来自与面向对象程序设计原则,即第一个原则 开闭原则:对新功能开放,对源代码修改闭
代理模式(静态代理)
- 用户:访问代理对象的角色,最终要对真实的对象进行操作
- 真实对象:被代理的角色,处于代理模式最底层,功能确定、完善后不在修改
- 代理对象: 代理对应的真实角色,并不断在其基础上附加一些所需的操作
- 抽象的接口:约束规范真实对象的操作,是真实对象核心的缩影(常由接口或抽象类组成)
实际开发中代理模式的使用
// 抽象描述一个web项目中 对用户的操作
// 1.抽象的接口
public interface UserService {
// 增删改查
public void add();
public void del();
public void update();
public void query();
}
// 2.真实对象
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("增加用户");
}
@Override
public void del() {
System.out.println("删除用户");
}
@Override
public void update() {
System.out.println("修改用户");
}
@Override
public void query() {
System.out.println("查找用户");
}
}
// 3.代理对象
public class UserServiceProxy{
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
/***
* 拓展方法 debug
* @param msg
*/
public void printLog(String msg){
System.out.println("[Debug] " + msg);
}
/**
* 代理 管理调用 真实角色方法
*/
public void add() {
printLog("add()");
userService.add();
}
public void del() {
printLog("del()");
userService.del();
}
public void update() {
printLog("update()");
userService.update();
}
public void query() {
printLog("query()");
userService.query();
}
}
// Spring bean xml注入
<bean id="userService" class="com.ht.demo02.UserServiceImpl"/>
<bean id="userServiceProxy" class="com.ht.demo02.UserServiceProxy">
<property name="userService" ref="userService"/>
</bean>
// 4. 用户测试
public class Test {
public static void main(String[] args) {
// java
UserService userService = new UserServiceImpl();
UserServiceProxy proxy = new UserServiceProxy();
proxy.setUserService(userService);
proxy.add();
// spring
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserServiceProxy userServiceProxy = context.getBean("userServiceProxy", UserServiceProxy.class);
userServiceProxy.add();
}
}
网友评论