未加星标

Java代理模式简单示例

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 20161001 | 作者 红领巾 ] 0人收藏点击收藏
静态代理

1、新建一个接口,这个接口所提供的方法是关于数据库操作的

public interface EmployeeDao {
publicvoidupdateSalary();
}

2、建一个目标类实现这个接口,这个目标类是我们要进行的业务

public class EmployeeDaoImpl implements EmployeeDao {
@Override
publicvoidupdateSalary() {
System.out.println("您的薪水又有更新");
}
}

3、再建一个代理类,为目标对象提供一种代理,并以控制对这个对象的访问。

public class EmployeeDaoProxy implements EmployeeDao{
private EmployeeDao employeeDao;
private Transaction transaction;
publicEmployeeDaoProxy(EmployeeDao employeeDao,Transaction transaction) {
this.employeeDao=employeeDao;
this.transaction=transaction;
}
@Override
publicvoidupdateSalary() {
this.transaction.startTransaction();
this.employeeDao.updateSalary();
this.transaction.commit();
}

由以上可知,代理模式的组成包括:目标接口(抽象角色),目标类(真实角色)和代理类(代理角色)。

4、代理类代理事务的处理,所以需要增加一个事务类

public class Transaction {
publicvoidstartTransaction(){
System.out.println("开启事务");
}
publicvoidcommit(){
System.out.print("事物提交");
}
}

5、最后我们用一个test case来测试一下

import static org.junit.Assert.*;
import org.junit.Test;
public class ProxyTest {
@Test
publicvoidtest() {
EmployeeDao target = new EmployeeDaoImpl();
Transaction transaction = new Transaction();
EmployeeDao proxy = new EmployeeDaoProxy(target,transaction);
proxy.updateSalary();
}
}

执行情况

开启事务
您的薪水又有更新
事物提交

假设上面的例子中的接口不只一个方法,或是不只一个接口要用到代理,上面的静态代理的代码就太过繁琐和冗余,所以就出现了jdk的动态代理。

动态代理

同样以上面的例子做示例

1和2中的接口和目标类的编写以及4中的事务处理是相同的,在3中,我们引入拦截器的概念,拦截器是实现动态性的核心

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/* * 拦截器 * 引入目标类和事务 * 通过构造器给目标函数和事务赋值 * 填充invoke方法 * */
public class EmployeeInterceptor implements InvocationHandler{
private Object target;
private Transaction transaction;
publicEmployeeInterceptor(Object target, Transaction transaction) {

this.target = target;
this.transaction = transaction;
}


@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
this.transaction.startTransaction();
method.invoke(this.target, args);
this.transaction.commit();
return null;
}
}

同样在test case中作出修改

import static org.junit.Assert.*;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class ProxyTest1 {
@Test
publicvoidtest() {
EmployeeDao target = new EmployeeDaoImpl();
Transaction transaction = new Transaction();
EmployeeInterceptor interceptor = new EmployeeInterceptor(target,transaction);
EmployeeDao employeeDao = (EmployeeDao)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor);
employeeDao.updateSalary();
}
}

最后看一下两次执行的情况

开启事务
您的薪水又有更新
事物提交

本文地址:http://www.linuxidc.com/Linux/2016-10/135739.htm


Java代理模式简单示例

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: JavaLinux数据数据库
分页:12
转载请注明
本文标题:Java代理模式简单示例
本站链接:http://www.codesec.net/view/483431.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(19)