代理模式

背景

代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

在实际应用中对用于对调用的方法进行拦截然后将方法增强以适应各种特殊的需求场景!!

代理分为静态代理和动态代理,区分就是静态代理是编译时就生成的,而动态代理是运行时生成的!!这里主要是看需要,没有绝对的好坏,静态代理速度快,而动态代理灵活!!

静态代理

简单的说就是让代理类也去实现被代理类的接口!!换句话说被代理的对象和代理类都实现了同一个接口,然后对这个接口定义的方法进行增强。
下面是通用框架:

//被代理的公共接口
interface Subject {
	// 定义了一个方法
	public void request();
}
 
//被代理对象
class RealSubject implements Subject {
	// 实现方法
	public void request() {
		// 业务处理
	}
}
 
//代理类
class Proxy implements Subject {
	// 要代理哪个实现类
	private Subject subject = null;
 
 
	public Proxy(Subject subject) {
		this.subject = subject
	}
 
	// 实现接口中定义的方法
	public void request() {
		this.before();
		this.subject.request();
		this.after();
	}
	// 增强处理
	private void before() {
		// do something
	}
	// 增强处理
	private void after() {
		// do something
	}
}

实现

定义一个"吃"的接口,现在对这个接口代理一下,增强”吃“方法,比如洗手洗碗。。。。下面是代理结构:
在这里插入图片描述

public interface IEat {
    void eat();
}
public class EatImpl implements IEat {
    @Override
    public void eat() {
        System.out.println("我要吃!!");
    }
}
public class Proxy implements IEat {
    private IEat proxyObject;

    public Proxy(IEat proxyObject){
        this.proxyObject=proxyObject;
    }
    @Override
    public void eat() {
        eatbefore();
        proxyObject.eat();
        eatafter();
    }
	//增强方法
    private void eatafter() {
        System.out.println("去洗碗筷!!");
    }
    private void eatbefore() {
        System.out.println("先洗手!!");
    }
}

最后调用实现类:

public class StaticProxyTest {
    public static void main(String[] args) {
        IEat proxyedObject=new EatImpl();
        Proxy proxy = new Proxy(proxyedObject);
        proxy.eat();
    }
}

在这里插入图片描述

动态代理

Java动态代理机制中有两个重要的类和接口InvocationHandler(接口)和Proxy(类),这一个类Proxy和接口InvocationHandler是我们实现动态代理的核心,利用反射机制生成一个实现代理接口的匿名类。
这里自己的注意的是:JDK动态代理只能代理实现了接口的类,没有实现接口的类是不能实现JDK动态代理。

实现

还是上面的吃的例子,下面是代理结构:
在这里插入图片描述
IEat和EatImpl是没有变,下面就是jdk代理的核心:

public class JdkProxy implements InvocationHandler {
    private Object obj;
    public JdkProxy(Object obj){
        this.obj=obj;
    }
    //通过Proxy类利用反射机制创建了这个代理类
    public Object create(){
        return Proxy.newProxyInstance(getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        eatbefore();
        Object invoke = method.invoke(obj, args);
        eatafter();
        return invoke;
    }
    //增强方法
    private void eatafter() {
        System.out.println("去洗碗筷!!");
    }

    private void eatbefore() {
        System.out.println("先洗手!!");
    }
}

在这里插入图片描述

cglib动态代理

用它就可以实现代理没有实现接口的类,其原理就是继承被代理类然后生成被代理类的子类,最终增强方法。既然是继承类实现的话,就不适用与final修饰类的情况,因为无法继承。
废话不多说,看实现。。。

实现

现在没有”吃“这个接口了,我们可以直接代理Eat类:

public class Ea{
    public void eat() {
        System.out.println("我要吃!!!");
    }
}
public class CglibProxy implements MethodInterceptor {
    private Object obj;

    public CglibProxy(Object obj){
        this.obj=obj;
    }
    //通过Enhancer类生成被代理类的子类
    public Object create(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        //设置回调,当调用方法时,回调重写的intercept方法
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        eatbefore();
        Object invoke = method.invoke(obj, objects);
        eatafter();
        return invoke;
    }
    private void eatafter() {
        System.out.println("去洗碗筷!!");
    }

    private void eatbefore() {
        System.out.println("先洗手!!");
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值