代理模式的英文叫做Proxy,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
在Spring框架中,广泛存在基于代理模式的面向切面编程,用作LOG日志记录和事务提交。下面用一个仿javaee的程序简单实现静态代理。
1.建立一个User用户
package com.StaticProxy.user;
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.建立一个DAO的Interface接口类,定义基本的CRUD操作
package com.StaticProxy.DAO;
import java.util.List;
import com.StaticProxy.user.User;
public interface IUserDAO {
public void doCreate(User user);
public void doUpdate(User user);
public void doRemove(User user);
public User findById(Integer id);
public List<User> findAll();
}
3.DAO类实现接口
package com.StaticProxy.DAO;
import java.util.List;
import com.StaticProxy.user.User;
public class UserDAO implements IUserDAO {
@Override
public void doCreate(User user) {
System.out.println("创建一个用户:doCreate");
}
@Override
public void doUpdate(User user) {
System.out.println("修改一个用户:doUpdate");
}
@Override
public void doRemove(User user) {
System.out.println("删除一个用户:doRemove");
}
@Override
public User findById(Integer id) {
System.out.println("查询一个用户:findById");
return null;
}
@Override
public List<User> findAll() {
System.out.println("查询所有用户:findAll");
return null;
}
}
4.静态代理类StaticProxy,同时简单写一个main函数进行测试
package com.StaticProxy.proxy;
import java.util.List;
import com.StaticProxy.DAO.IUserDAO;
import com.StaticProxy.DAO.UserDAO;
import com.StaticProxy.user.User;
public class StaticProxy implements IUserDAO{
private IUserDAO iUserDAO;
public IUserDAO bind(IUserDAO userDao) {
this.iUserDAO = userDao;
return this;
}
//增加log记录
private void log(String name) {
System.out.println("操作:" + name + " 日志记录");
}
//commit事务处理
private void commit() {
System.out.println("commit事务提交");
}
@Override
public void doCreate(User user) {
log("doCreate");
this.iUserDAO.doCreate(user);
commit();
}
@Override
public void doUpdate(User user) {
log("doUpdate");
this.iUserDAO.doUpdate(user);
commit();
}
@Override
public void doRemove(User user) {
log("doRemove");
this.iUserDAO.doRemove(user);
commit();
}
@Override
public User findById(Integer id) {
log("doRemove");
this.iUserDAO.findById(id);
commit();
return null;
}
@Override
public List<User> findAll() {
log("doRemove");
this.iUserDAO.findAll();
commit();
return null;
}
public static void main(String[] args) {
IUserDAO userDao = new UserDAO();
IUserDAO StaticProxy = new StaticProxy().bind(userDao);
User user = new User();
StaticProxy.findAll();
}
}
5.简单测试一个方法findAll(),可以看到执行结果中前面记录了log日志,后面提交了事务