例如
查看个人工资:
* 启动日志,进行记录
* 启动安全性的框架
* 验证权限
如果有权限,则查看工资
如果没有权限,则输出没有权限
public class Logger {
public void logging(){
System.out.println("logging");
}
}
public class Security {
public void security(){
System.out.println("security");
}
}
public class Privilege {
private String access;
public String getAccess() {
return access;
}
public void setAccess(String access) {
this.access = access;
}
}
public class SalaryManager {
private Logger logger;
private Security security;
private Privilege privilege;
public SalaryManager(Logger logger,Security security,Privilege privilege){
this.logger = logger;
this.security = security;
this.privilege = privilege;
}
public void showSalary(){
this.logger.logging();
this.security.security();
if("admin".equals(this.privilege.getAccess())){
System.out.println("正在查看工资:涨了2W");
}else{
System.out.println("您没有该权限");
}
}
}
public class SalaryTest {
@Test
public void test(){
Logger logger = new Logger();
Privilege privilege = new Privilege();
Security security = new Security();
privilege.setAccess("admin");
SalaryManager salaryManager = new SalaryManager(logger, security, privilege);
salaryManager.showSalary();
}
}
开始重构
public interface SalaryManager {
public void showSalary();
}
public class SalaryManagerImpl implements SalaryManager{
@Override
public void showSalary() {
System.out.println("正在查看工资:哦哦,涨了2W闽比");
}
}
/**
* 1、导入日志、安全性框架、权限 2、目标对象 3、在代理对象的方法中调用上述的方法
*
* @author Administrator
*
*/
public class SalaryManagerProxy implements SalaryManager {
private Logger logger;
private Security security;
private Privilege privilege;
private SalaryManager target;
public SalaryManagerProxy(Logger logger, Security security,
Privilege privilege, SalaryManager target) {
this.logger = logger;
this.security = security;
this.privilege = privilege;
this.target = target;
}
@Override
public void showSalary() {
this.logger.logging();// 启动日志
this.security.security();// 安全性框架
if ("admin".equals(this.privilege.getAccess())) {
this.target.showSalary();
} else {
System.out.println("您没有权限");
}
}
}
public class ProxyTest {
@Test
public void test(){
Logger logger = new Logger();
Privilege privilege = new Privilege();
privilege.setAccess("asdf");
Security security = new Security();
SalaryManager target = new SalaryManagerImpl();
SalaryManagerProxy proxy = new SalaryManagerProxy(logger, security, privilege, target);
proxy.showSalary();
}
}
动态代理重构
/**
* 1、把日志、安全性框架、权限导入进去
* 2、把目标类导入进去
* 3、上述两类通过构造函数赋值
* @author Administrator
*
*/
public class SalaryInterceptor implements InvocationHandler{
private Logger logger;
private Security security;
private Privilege privilege;
private Object target;
public SalaryInterceptor(Logger logger,Security security,Privilege privilege,Object target){
this.logger = logger;
this.security = security;
this.privilege = privilege;
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("aaaaaa");
this.logger.logging();
this.security.security();
if("admin".equals(this.privilege.getAccess())){
//调用目标类的目标方法
method.invoke(this.target, args);
}else{
System.out.println("您没有该权限");
}
System.out.println("bbbbbb");
return null;
}
}
/**
* 1、拦截器的作用究竟是什么?
* * 给目标类及其他的类赋值
* * 拦截器中的invoke方法的内容就是代理对象的方法的内容
* 2、代理对象的方法体是什么?
* 就是拦截器中invoke方法中的内容
* 3、在拦截器中有一个方法为invoke方法的第二个参数method,该参数是什么时候传递进去的
* 代理对象调用方法的时候,就进入了拦截器中invoke方法中
* 4、动态代理模式到底解决了什么问题
* @author Administrator
*/
public class ProxyTest {
@Test
public void test(){
Logger logger = new Logger();
Privilege privilege = new Privilege();
privilege.setAccess("aaaa");
Security security = new Security();
SalaryManager target = new SalaryManagerImpl();
SalaryInterceptor interceptor = new SalaryInterceptor(logger, security, privilege, target);
/**
* 1、目标类的类加载器
* 2、目标类的所有的接口
* 3、拦截器
*/
SalaryManager proxy = (SalaryManager) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor);
proxy.showSalary();//代理对象的代理方法
}
}
HIbernate
public class Transaction {
public void beginTransaction(){
System.out.println("begin transaction");
}
public void commit(){
System.out.println("commit");
}
}
public class Person {
private Long pid;
private String pname;
public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
}
/**
* 目标接口
* @author Administrator
*
*/
public interface PersonDao {
public void savePerson();
public void updatePerson();
public void deletePerson();
public List<Person> getPerson();
}
public class PersonDaoImpl implements PersonDao{
@Override
public void savePerson() {
// TODO Auto-generated method stub
System.out.println("save person");
}
@Override
public void updatePerson() {
// TODO Auto-generated method stub
System.out.println("update person");
}
@Override
public void deletePerson() {
// TODO Auto-generated method stub
System.out.println("delete person");
}
@Override
public List<Person> getPerson() {
// TODO Auto-generated method stub
Person person = new Person();
person.setPid(1L);
person.setPname("aaa");
List<Person> personList = new ArrayList<Person>();
personList.add(person);
for(Person person2:personList){
System.out.println(person2.getPname());
}
return personList;
}
}
public class PersonDaoInteceptor implements InvocationHandler{
private Transaction transaction;
private Object target;
public PersonDaoInteceptor(Transaction transaction,Object target){
this.transaction = transaction;
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object obj;
String methodName = method.getName();
if("savePerson".equals(methodName)||
"updatePerson".equals(methodName)||
"deletePerson".equals(methodName)){
this.transaction.beginTransaction();
obj = method.invoke(this.target, args);//调用目标类的目标方法
this.transaction.commit();
}else{
obj = method.invoke(this.target, args);//调用目标类的目标方法
}
return obj;
}
}
public class PersonDaoTest {
@Test
public void test(){
Transaction transaction = new Transaction();
PersonDao target = new PersonDaoImpl();
PersonDaoInteceptor inteceptor = new PersonDaoInteceptor(transaction, target);
PersonDao proxy = (PersonDao)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), inteceptor);
proxy.getPerson();
}
}