JAVA 设计模式:静态代理VS动态代理
2014-03-13 16:41
941 查看
采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。
按照代理类的创建时期,可以分为:静态代理和动态代理。
所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。
所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。
静态代理类的特点: 代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。而且代理类只能为特定的接口(Service)服务。
动态代理: 代理类需要实现InvocationHandler接口。
使用场合举例: 如果需要委托类处理某一业务,那么我们就可以先在代理类中,对客户的权限、各类信息先做判断,如果不满足某一特定条件,则将其拦截下来,不让其代理。
上代码:
[java] view
plaincopyprint?
package com.bankht.Proxy;
/**
* @类说明 :
*/
public interface Service {
//<实现接口
/**
* 查询日期
*/
public String queryDate();
/**
* 计算两个整数之差
*/
public int sub(int a, int b);
}
[java] view
plaincopyprint?
package com.bankht.Proxy;
import java.util.Date;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-27 上午11:12:30
*
* @类说明 :
*/
public class ServiceImpl implements Service {
@Override
public String queryDate() {
return new Date().toString();
}
@Override
public int sub(int a, int b) {
return a - b;
}
public String ownMethod() {
System.out.println("It's my own method");
return "admin";
}
}
[java] view
plaincopyprint?
package com.bankht.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-27 上午11:07:15
*
* @类说明 :
*/
public class ServiceProxy implements InvocationHandler {
private Object target;
public ServiceProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
if (!(target instanceof ServiceImpl)) {
System.out.println("不能代理该对象");
return result;
} else if (!((ServiceImpl) target).ownMethod().equals("admin")) {
System.out.println("权限不够");
return result;
}
result = method.invoke(target, args);
return result;
}
/**
* @param target
* @return 返回委托类接口的实例对象
*/
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
[java] view
plaincopyprint?
package com.bankht.Proxy;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-27 上午11:10:10
*
* @类说明 :
*/
public class ServiceTest {
public static void main(String[] args) {
// 创建委托类实例,即被代理的类对象
ServiceImpl target = new ServiceImpl();
// 创建动态代理类
ServiceProxy proxy = new ServiceProxy(target);
Service service = (Service) proxy.getProxyInstance();
String date = service.queryDate();
System.out.println(date);
int result = service.sub(10, 20);
System.out.println("10-20 = " + result);
}
}
运行一下:
[html] view
plaincopyprint?
It's my own method
Wed Jun 27 11:27:13 CST 2012
It's my own method
10-20 = -10
如果将
ServiceImpl.java 中ownMethod()方法
return "admin";
改为:
return "ak47";
运行一下:
[html] view
plaincopyprint?
It's my own method
权限不够
null
It's my own method
权限不够
Exception in thread "main" java.lang.NullPointerException
at $Proxy0.sub(Unknown Source)
at com.bankht.Proxy.ServiceTest.main(ServiceTest.java:18)
按照代理类的创建时期,可以分为:静态代理和动态代理。
所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。
所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。
静态代理类的特点: 代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。而且代理类只能为特定的接口(Service)服务。
动态代理: 代理类需要实现InvocationHandler接口。
使用场合举例: 如果需要委托类处理某一业务,那么我们就可以先在代理类中,对客户的权限、各类信息先做判断,如果不满足某一特定条件,则将其拦截下来,不让其代理。
上代码:
[java] view
plaincopyprint?
package com.bankht.Proxy;
/**
* @类说明 :
*/
public interface Service {
//<实现接口
/**
* 查询日期
*/
public String queryDate();
/**
* 计算两个整数之差
*/
public int sub(int a, int b);
}
[java] view
plaincopyprint?
package com.bankht.Proxy;
import java.util.Date;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-27 上午11:12:30
*
* @类说明 :
*/
public class ServiceImpl implements Service {
@Override
public String queryDate() {
return new Date().toString();
}
@Override
public int sub(int a, int b) {
return a - b;
}
public String ownMethod() {
System.out.println("It's my own method");
return "admin";
}
}
[java] view
plaincopyprint?
package com.bankht.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-27 上午11:07:15
*
* @类说明 :
*/
public class ServiceProxy implements InvocationHandler {
private Object target;
public ServiceProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
if (!(target instanceof ServiceImpl)) {
System.out.println("不能代理该对象");
return result;
} else if (!((ServiceImpl) target).ownMethod().equals("admin")) {
System.out.println("权限不够");
return result;
}
result = method.invoke(target, args);
return result;
}
/**
* @param target
* @return 返回委托类接口的实例对象
*/
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
[java] view
plaincopyprint?
package com.bankht.Proxy;
/**
* @author: 特种兵—AK47
* @创建时间:2012-6-27 上午11:10:10
*
* @类说明 :
*/
public class ServiceTest {
public static void main(String[] args) {
// 创建委托类实例,即被代理的类对象
ServiceImpl target = new ServiceImpl();
// 创建动态代理类
ServiceProxy proxy = new ServiceProxy(target);
Service service = (Service) proxy.getProxyInstance();
String date = service.queryDate();
System.out.println(date);
int result = service.sub(10, 20);
System.out.println("10-20 = " + result);
}
}
运行一下:
[html] view
plaincopyprint?
It's my own method
Wed Jun 27 11:27:13 CST 2012
It's my own method
10-20 = -10
如果将
ServiceImpl.java 中ownMethod()方法
return "admin";
改为:
return "ak47";
运行一下:
[html] view
plaincopyprint?
It's my own method
权限不够
null
It's my own method
权限不够
Exception in thread "main" java.lang.NullPointerException
at $Proxy0.sub(Unknown Source)
at com.bankht.Proxy.ServiceTest.main(ServiceTest.java:18)
相关文章推荐
- Java设计模式——代理模式(静态代理vs动态代理)
- java 设计模式之四-代理模式 java静态代理和动态代理
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- 代理设计模式之(静态代理+Java自身提供的动态代理机制)
- java设计模式--代理模式(静态代理和动态代理)
- java设计模式-代理模式(静态代理,动态代理)
- 【设计模式之二:代理模式】代理模式(静态代理VS动态代理)
- JAVA设计模式之代理模式(静态代理和动态代理)
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- Java 设计模式——静态代理模式和动态代理模式
- Java设计模式之静态代理和动态代理(简单例子)
- Java设计模式之 静态代理和动态代理
- Java设计模式学习06——静态代理与动态代理
- 【GOF23设计模式】_代理模式_静态代理_动态代理_开发场景JAVA236-237
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- java设计模式之代理模式 (静态&动态)
- Java设计模式(七) Spring AOP JDK动态代理 VS. cglib
- java设计模式之四:代理模式 java静态代理和动态代理
- java代理设计模式(静态代理与动态代理)
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理