昆明java培训
达内昆明广州春城路

18487146383

热门课程

Java代理模式简单示例

  • 时间:2016-10-06
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明Java培训机构的老师给大家讲Java代理模式

静态代理

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

public interface EmployeeDao {

public void updateSalary();

}

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

public class EmployeeDaoImpl implements EmployeeDao {

@Override

public void updateSalary() {

System.out.println("您的薪水又有更新");

}

}

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

public class EmployeeDaoProxy implements EmployeeDao{

private EmployeeDao employeeDao;

private Transaction transaction;

public EmployeeDaoProxy(EmployeeDao employeeDao,Transaction transaction) {

this.employeeDao=employeeDao;

this.transaction=transaction;

}

@Override

public void updateSalary() {

this.transaction.startTransaction();

this.employeeDao.updateSalary();

this.transaction.commit();

}

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

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

public class Transaction {

public void startTransaction(){

System.out.println("开启事务");

}

public void commit(){

System.out.print("事物提交");

}

}

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

import static org.junit.Assert.*;

import org.junit.Test;

public class ProxyTest {

@Test

public void test() {

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;

public EmployeeInterceptor(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

public void test() {

EmployeeDao target = new EmployeeDaoImpl();

Transaction transaction = new Transaction();

EmployeeInterceptor interceptor = ew EmployeeInterceptor(target,transaction);

EmployeeDao employeeDao = (EmployeeDao)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor);

employeeDao.updateSalary();

}

}

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

开启事务

您的薪水又有更新

事物提交

学Java开发就到昆明达内Java培训班!了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

上一篇:equals应该考虑null值情景
下一篇:怎么用Atitit判断一张图片是否包含另一张小图片

iPhone摄像头发展史一步一个脚印

腾讯游戏Switch独立销量领先——昆明达内

达内java语言编程学以致用

苹果技术:A11芯片上新菜【达内培训】

选择城市和中心
贵州省

广西省

海南省