JAVA 代理模式

好处

那么这样做有什么好处呢?我也可以直接去访问卖家呀?这其实就是涉及到AOP的知识了(Spring内容,面向切片),实现我们基本业务逻辑和其他处理的分离,降低代码的耦合性。同时也能够在基础功能上,不改变源代码的前提下增加新的功能。

代理模式分类

======

一、静态代理


静态代理顾名思义,是静态的代码,也就是我们在编译的时候就已经确定了的,这样虽然能够实现我们代理模式,但是失去代码的灵活性,不能满足我们动态编程的需求。下面来看代码。

定义静态代理模式的步骤

一、创建一个代理接口,也就是被代理方所需要实现的最基本的功能。

interface Object1{

void action();

}

复制代码

二、创建一个被代理类,实现代理接口,重写接口中的方法。

//被代理类

class ObjectImpl implements Object1{

@Override

public void action() {

System.out.println(“=被代理类开始执行==”);

System.out.println(“具体操作====”);

System.out.println(“被代理类执行完毕====”);

}

}

复制代码

三、创建一个对应的代理类,同样实现代理接口,重写接口中的方法,在类中定义一个Object类,用来获取到被代理类的对象,然后执行被代理对象的方法+自己另外的功能方法

//代理类

class ProxyObject implements Object1{

Object1 obj;

public ProxyObject() {

System.out.println(“代理类创建成功”);

obj = new ObjectImpl();

}

@Override

public void action() {

System.out.println(“代理类开始执行”);

obj.action();

}

}

复制代码

image.png

其实这时候我们也发现一个问题,那就是代码很不灵活,我们需要在编译前就想好哪写类需要用到代理模式并且给它们写好对应的代理类,这样未免也太麻烦了! 那么这时候基于反射原理动态代理就有用武之地!

二、动态代理


前面说到,动态代理基于的是java反射原理,那么具体怎么用到的呢? 其实就是我们在原来被代理类和代理类一对一的关系把它简化成了被代理类和代理类多对一的关系,我们只需要创建一个动态代理类,实现InvocationHandler接口,然后通过动态获取传入的被代理的对象,并动态执行代理对象的方法。这样听起来好像有点绕,那么我们根据代码来具体看一看:

定义动态代理模式的步骤

一、创建代理接口,也就是被代理方所需要实现的最基本的功能(这里为了体现动态代理的功能所以定义了两个不同的代理)

//动态代理的接口1

interface Subject{

void action();

}

//动态代理的接口2

interface ClothFactory{

void test();

}

复制代码

二、创建被代理类,实现代理接口,重写接口中的方法。

//被代理类1

class RealSubject implements Subject{

@Override

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

总结

就写到这了,也算是给这段时间的面试做一个总结,查漏补缺,祝自己好运吧,也希望正在求职或者打算跳槽的 程序员看到这个文章能有一点点帮助或收获,我就心满意足了。多思考,多问为什么。希望小伙伴们早点收到满意的offer! 越努力越幸运!

金九银十已经过了,就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

三面蚂蚁核心金融部,Java开发岗(缓存+一致性哈希+分布式)

复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。我偶然得到一份整理的资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。**

[外链图片转存中…(img-CCXOk1fR-1711370697064)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java代理模式是一种结构型设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。代理对象可以在客户端和目标对象之间充当中介,以便于客户端访问目标对象时,可以在不改变目标对象的情况下添加一些额外的功能,比如安全性、远程访问、缓存等。 在Java中,代理模式可以通过两种方式实现:静态代理和动态代理。静态代理需要手动编写代理类,而动态代理可以在运行时通过反射机制动态生成代理类,更加灵活。 举个例子,假设我们有一个接口`Subject`,其中定义了一些方法。我们希望在调用这些方法时,增加一些额外的日志记录功能。我们可以编写一个代理类`SubjectProxy`,在代理类中实现接口方法并调用目标对象的方法,同时在方法前后添加日志记录的代码。客户端则通过代理类访问目标对象。 静态代理示例代码如下: ```java public interface Subject { void doSomething(); } public class RealSubject implements Subject { @Override public void doSomething() { System.out.println("RealSubject do something."); } } public class SubjectProxy implements Subject { private Subject realSubject; public SubjectProxy(Subject realSubject) { this.realSubject = realSubject; } @Override public void doSomething() { System.out.println("Before do something."); realSubject.doSomething(); System.out.println("After do something."); } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); Subject subjectProxy = new SubjectProxy(realSubject); subjectProxy.doSomething(); } } ``` 动态代理示例代码如下: ```java public class SubjectHandler implements InvocationHandler { private Object target; public SubjectHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before " + method.getName()); Object result = method.invoke(target, args); System.out.println("After " + method.getName()); return result; } } public class Client { public static void main(String[] args) { Subject realSubject = new RealSubject(); InvocationHandler handler = new SubjectHandler(realSubject); Subject subjectProxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler); subjectProxy.doSomething(); } } ``` 无论是静态代理还是动态代理,代理模式都可以在不改变目标对象的情况下,为其添加额外的功能,提高代码的可复用性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值