代理模式:代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息,过滤消息,把消息转发给委托类,以及事后处理消息等,代理类与委托类之间存在关联关系,代理类对象本身不真正实现服务,而是通过委托类的对象的相关方法来提供特定的服务,可以借助代理模式增加一些功能(开闭原则,增加功能),代理类的分类:
(1)静态代理:在程序运行前,代理类的.class文件已经存在了
/**
*
* @author Administrator
* @date 2018年10月2日
* @package design_pattern
* 接口,一个人可以被代理的行为
*/
interface AgencyTest{
public void buyHouse();
public void findJob();
}
class worker implements AgencyTest{
@Override
public void buyHouse() {
System.out.println("工人:我要买一套两居室的价格在30万左右的房子");
}
public void findJob() {
System.out.println("工人:我想要找一个不拖欠工资的工作");
}
}
class whiteCollar implements AgencyTest{
@Override
public void buyHouse() {
// TODO 自动生成的方法存根
System.out.println("白领:我想要买一套交通方便的房子,面积不要太大");
}
@Override
public void findJob() {
// TODO 自动生成的方法存根
System.out.println("白领:我想要找一份加班少,待遇好的公司");
}
}
class Agency implements AgencyTest{
private AgencyTest person;
public Agency(AgencyTest person) {
this.person = person;
}
@Override
public void buyHouse() {
// TODO 自动生成的方法存根
System.out.println("中介:您好,欢迎选择购房中介,您有什么需求?");
person.buyHouse();
System.out.println("中介:我们会尽快帮您找到合适的房源");
}
@Override
public void findJob() {
// TODO 自动生成的方法存根
System.out.println("中介:您好,欢迎光临工作无忧,您对工作有什么需求?");
person.findJob();
System.out.println("中介:感谢您的光临,我们会尽快帮您匹配合适的岗位");
}
}
public class StaticAgencyDemo{
public static void main(String[] args) {
worker w = new worker();
whiteCollar wc = new whiteCollar();
Agency agency1 = new Agency(w);
agency1.buyHouse();
agency1.findJob();
Agency agency2 = new Agency(wc);
agency2.buyHouse();
agency2.findJob();
}
}
(2)动态代理:在程序运行时,运用反射机制动态创建而成,JDK动态代理代理的是接口,通过Proxy的newProxyInstance得到代理对象;Cglib动态代理,代理的是类,不需要业务继承接口,通过派生子类来实现代理
动态代理的好处:简化了编程工作,提高了软件系统的可扩展性
//JDK动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 目标要实现的接口
* @author Administrator
* @date 2018年10月2日
* @package design_pattern
*/
interface JDKDemoInter{
public void detailShow(String s);
}
/**
* 要代理的类
* 必须要有实现的接口
* @author Administrator
* @date 2018年10月2日
* @package design_pattern
*/
class JDKClassDemo implements JDKDemoInter{
private String name;
@Override
public void detailShow(String s) {
// TODO 自动生成的方法存根
System.out.println("你好,我是JDKClassDemo,你输入的是"+s);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* jdk动态代理
* 使用java.lang.reflect.proxy类来实现代理
* @author Administrator
* @date 2018年10月2日
* @package design_pattern
*/
class JDKProxy1{
private Object obj;
public JDKProxy1(Object obj) {
this.obj = obj;
}
//生成代理对象
/**
* classloader 对象的类加载器
* Class<?>[] interfaces目标对象实现的接口类型
* InvocationHandler 事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
* @return
*/
public Object getProxyInstance() {
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
System.out.println("执行前");
Object returnObj = method.invoke(obj, args);
System.out.println("执行后");
return returnObj;
}
});
}
}
class JDKProxy2 implements InvocationHandler{
private Object obj;
public Object getInstance(Object obj) {
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
System.out.println("执行前");
Object returnObj = method.invoke(this.obj, args);
System.out.println("执行后");
return returnObj;
}
}
public class JDKDynamicAgencyDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
JDKClassDemo demo = new JDKClassDemo();
JDKDemoInter proxyDemo = (JDKDemoInter)new JDKProxy1(demo).getProxyInstance();
proxyDemo.detailShow("000");
JDKClassDemo demo1 = new JDKClassDemo();
JDKDemoInter proxyDemo1 = (JDKDemoInter)new JDKProxy2().getInstance(demo1);
proxyDemo.detailShow("111");
}
}
//cglib动态代理
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
class CglibClass{
public void say() {
System.out.println("this is CglibClass");
}
public static void say1() {
System.out.println("this is static");
}
public final void say2() {
System.out.println("this is final");
}
}
class CglibProxy implements MethodInterceptor{
//目标对象
private Object obj;
public CglibProxy(Object obj) {
this.obj = obj;
}
//生成代理对象
public Object getProxyInstance() {
//设置工具类
Enhancer en = new Enhancer();
//设置父类
en.setSuperClass(obj.getClass());
//设置回调函数
en.setCallable(this);
//返回创建的子类(代理对象),因为cglib又被称为子类代理
return en.create();
}
@Override
public Object intercept(Object arg0,Method method,Object[] arg2,MethodProxy arg3) throws Throwable {
System.out.println("执行前");
Object returnObj = method.invoke(obj, arg2);
System.out.println("执行后");
return returnObj;
}
}
public class cglibDynamicAgencyDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
CglibClass cglib = new CglibClass();
CglibClass proxy = (CglibClass)new CglibProxy(cglib).getProxyInstance();
System.out.println(proxy);
proxy.say();
proxy.say1();
proxy.say2();
}
}