设计模式---代理模式

代理模式的基本介绍

代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。

静态代理

介绍:静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类

代码:

package com.study.designPattern;

/**
* @Author guangwenyin
*
*/
public class StaticProxyTest {
public static void main(String[] args) {
//创建目标对象
TargetClass targetClass=new TargetClass();
//创建代理对象
ProxyClass proxyClass=new ProxyClass(targetClass);
//执行代理对象的方法
proxyClass.m1();
}
}

//目标类实现的接口
interface ITest{

void m1();
}

//目标类
class TargetClass implements ITest{

@Override
public void m1() {
System.out.println("i am TargetClass m1()...");
}
}

//代理类
class ProxyClass implements ITest{

TargetClass targetClass;

public ProxyClass(TargetClass targetClass) {
this.targetClass = targetClass;
}

@Override
public void m1() {
System.out.println("i am ProxyClass m1 start...");
targetClass.m1();
System.out.println("i am ProxyClass m1 end...");
}
}

动态代理

JDK动态代理

介绍:代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用jdk动态代理

代码:

package com.study.designPattern;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* @Author guangwenyin
*
*/
public class JDKDynamicProxyTest {
public static void main(String[] args) {
//创建目标对象
TargetClass2 targetClass2=new TargetClass2();
//创建代理对象
ITest2 iTest2 = (ITest2) Proxy.newProxyInstance(ITest2.class.getClassLoader(),
TargetClass2.class.getInterfaces(),
(proxy, method, args1) -> {
System.out.println("i am jdk proxy start ...");
Object result = method.invoke(targetClass2, args1);
System.out.println("i am jdk proxy end ...");
return result.toString()+" how are you?";
});
//调用代理对象方法,并获取返回值
String s = iTest2.m2();
System.out.println(s);

}
}

//目标类实现的接口
interface ITest2{
String m2();
}

//目标类
class TargetClass2 implements ITest2{

@Override
public String m2() {
System.out.println("i am TargetClass2 m2()...");
return "hello jdk proxy!";
}
}


Cglib动态代理

介绍: 静态代理和 JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是 Cglib 代理,用cglib要先引用相关依赖。

代码:

package com.study.designPattern;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
* @Author guangwenyin
*
*/
public class CglibProxyTest {
public static void main(String[] args) {
//创建目标对象
TargetClass3 targetClass3=new TargetClass3();
//创建代理工厂对象
CglibProxyFactory cglibProxyFactory=new CglibProxyFactory(targetClass3);
//创建代理对象
TargetClass3 proxyInstance = (TargetClass3) cglibProxyFactory.getProxyInstance();
//调用代理对象方法
String s = proxyInstance.m3();
System.out.println(s);
}
}

//目标类
class TargetClass3{
String m3(){
System.out.println("i am TargetClass3 m3()...");
return "hello cglib proxy!";
}
}

//代理工厂
class CglibProxyFactory implements MethodInterceptor {

Object target;

public CglibProxyFactory(Object target) {
this.target = target;
}

public Object getProxyInstance(){
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}


@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("i am cglib proxy start...");
Object result = method.invoke(target, objects);
System.out.println("i am cglib proxy end...");
return result+" how are you?";
}
}


学无止境,让学习成为一种习惯。
本人水平有限,有不对的地方请指教,谢谢。

posted @ 2021-11-25 16:59  霞宝的油腻大叔  阅读(31)  评论(0)    收藏  举报