宇宙条面试:这样跟面试官说代理,面试官对我竖起了大拇指!

article/2025/4/22 5:01:58

什么是代理

代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

​代理其实不仅仅是在软件开发领域,在我们的日常生活中也是时常可见。比如某p2p老板突然携款带着小姨子跑路了,可怜了下面一堆的程序员背负一身房贷,上有老下有小,程序员只能被迫去申请劳动仲裁,劳动局就会为其指派一位代理律师全权负责程序员的仲裁事宜(PS:p2p跑路仲裁拿回工资的可能性非常低,没让你把工资退回就算好的了)。那这里面就是使用了代理模式,因为在劳动仲裁这个活动中,代理律师会全权代理程序员。比如:房东要将房子出售,于是到房地产中介公司找一个中介(代理),由他来帮房东完成销售房屋,签订合同、网签、贷款过户等等事宜。

代理模式

在这里插入图片描述
这是常见代理模式常见的 UML 示意图。
需要注意的有下面几点:

  1. 用户只关心接口功能,而不在乎谁提供了功能。上图中接口是 Subject
  2. 接口真正实现者是上图的 RealSubject,但是它不与用户直接接触,而是通过代理。
  3. 代理就是上图中的 Proxy,由于它实现了 Subject 接口,所以它能够直接与用户接触。
  4. 用户调用 Proxy 的时候,Proxy 内部调用了 RealSubject。所以,Proxy 是中介者,它可以增强 RealSubject 操作。
  • 代理又可以分为静态代理和动态代理两种。我们先来看下静态代理。

静态代理

电影是电影公司委托给影院进行播放的,但是影院可以在播放电影的时候,产生一些自己的经济收益,比如提供按摩椅,娃娃机(这个每次去电影院都会尝试下,基本上是夹不起来,有木有大神可以传授下诀窍),卖爆米花、饮料(贵的要死,反正吃不起)等。我们平常去电影院看电影的时候,在电影开始的阶段是不是经常会放广告呢?然后在影片开始结束时播放一些广告。
下面我们通过代码来模拟下电影院这一系列的赚钱操作。
首先得有一个接口,通用的接口是代理模式实现的基础。这个接口我们命名为 Movie,代表电影播放的能力。

package com.workit.demo.proxy;public interface Movie {void play();
}
  • 接下来我们要创建一个真正的实现这个 Movie 接口的类,和一个实现该接口的代理类。
    真正的类《美国队长》电影:
package com.workit.demo.proxy;public class CaptainAmericaMovie implements Movie {@Overridepublic void play() {System.out.println("普通影厅正在播放的电影是《美国队长》");}
}

代理类:

package com.workit.demo.proxy;public class MovieStaticProxy implements Movie {Movie movie;public MovieStaticProxy(Movie movie) {this.movie = movie;}@Overridepublic void play() {playStart();movie.play();playEnd();}public void playStart() {System.out.println("电影开始前正在播放广告");}public void playEnd() {System.out.println("电影结束了,接续播放广告");}
}

测试类:

package com.workit.demo.proxy;package com.workit.demo.proxy;public class StaticProxyTest {public static void main(String[] args) {Movie captainAmericaMovie = new CaptainAmericaMovie();Movie movieStaticProxy = new MovieStaticProxy(captainAmericaMovie);movieStaticProxy.play();}
}

运行结果:

电影开始前正在播放广告
正在播放的电影是《美国队长》
电影结束了,接续播放广告

现在可以看到,代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。这个就是是静态代理的内容,为什么叫做静态呢?因为它的类型是事先预定好的,比如上面代码中的 MovieStaticProxy 这个类。

优点
  • 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
  • 代理对象可以扩展目标对象的功能
  • 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度。
缺点
  • 代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护。

jdk动态代理

与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。

  • 接着上面的例子,刚看完《美国队长》不过瘾,还想继续去看一场《钢铁侠》。一直在普通影厅看电影觉得没啥意思,那就赶紧去VIP影厅(至今不知道长啥样子)体验一把。既然 实体店没体验过那就用代码来体验一次吧。创建一个VIPMovie电影接口
package com.workit.demo.proxy;
public interface VIPMovie {void vipPlay();
}

紧接着创建一个VIP影厅的播放实现类

package com.workit.demo.proxy;public class IronManVIPMovie implements VIPMovie {@Overridepublic void vipPlay() {System.out.println("VI影厅正在播放的电影是《钢铁侠》");}
}

如果按照静态代理我们是不是又要创建一个VIP影厅播放的代理实现类,这种方式我们就不演示了。下面我们来看看通过动态代理怎么来实现吧。

package com.workit.demo.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler {private Object object;public MyInvocationHandler(Object object) {this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {playStart();Object invoke = method.invoke(object, args);playEnd();return invoke;}public void playStart() {System.out.println("电影开始前正在播放广告");}public void playEnd() {System.out.println("电影结束了,接续播放广告");}
}

MyInvocationHandler实现了 InvocationHandler 这个类,这个类是什么意思呢?大家不要慌张,下面我会解释。然后,我们就可以在VIP影厅看电影了。

package com.workit.demo.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;public class DynamicProxyTest {public static void main(String[] args) {IronManVIPMovie ironManVIPMovie = new IronManVIPMovie();InvocationHandler invocationHandler = new MyInvocationHandler(ironManVIPMovie);VIPMovie dynamicProxy = (VIPMovie) Proxy.newProxyInstance(IronManVIPMovie.class.getClassLoader(),IronManVIPMovie.class.getInterfaces(), invocationHandler);dynamicProxy.vipPlay();}
}

输出结果:

电影开始前正在播放广告
VI影厅正在播放的电影是《钢铁侠》
电影结束了,接续播放广告

看到没有,我们并没有像静态代理那样为 VIPMovie接口实现一个代理类,但最终它仍然实现了相同的功能,这其中的差别,就是之前讨论的动态代理所谓“动态”的原因。
我们顺带把《美国队长》也用动态代理实现下吧。

package com.workit.demo.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;public class DynamicProxyTest {public static void main(String[] args) {// VIP 影厅《钢铁侠》IronManVIPMovie ironManVIPMovie = new IronManVIPMovie();InvocationHandler invocationHandler = new MyInvocationHandler(ironManVIPMovie);VIPMovie dynamicProxy = (VIPMovie) Proxy.newProxyInstance(IronManVIPMovie.class.getClassLoader(),IronManVIPMovie.class.getInterfaces(), invocationHandler);dynamicProxy.vipPlay();// 普通影厅《美国队长》CaptainAmericaMovie captainAmericaMovie = new CaptainAmericaMovie();InvocationHandler invocationHandler1 = new MyInvocationHandler(captainAmericaMovie);Movie dynamicProxy1 = (Movie) Proxy.newProxyInstance(CaptainAmericaMovie.class.getClassLoader(),CaptainAmericaMovie.class.getInterfaces(), invocationHandler1);dynamicProxy1.play();}
}

输出结果:

电影开始前正在播放广告
VI影厅正在播放的电影是《钢铁侠》
电影结束了,接续播放广告
电影开始前正在播放广告
正在播放的电影是《美国队长》
电影结束了,接续播放广告

我们通过 Proxy.newProxyInstance() 方法,却产生了 MovieVIPMovie两种接口的实现类代理,这就是动态代理的魔力。

JDK动态代理到底是怎么实现的呢

动态代码涉及了一个非常重要的类 Proxy。正是通过 Proxy 的静态方法 newProxyInstance 才会动态创建代理。具体怎么去创建代理类就不分析了,感兴趣的可以去看下源码。我们直接看下生成的代理类。
如何查看生成的代理类?
在生成代理类之前加上以下代码(我用的jdk1.8):

 //新版本 jdk产生代理类   System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");

如果上述代码加上不生效可以考虑加下下面的代码:

// 老版本jdk
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
//  该设置用于输出cglib动态代理产生的类
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "C:\\class");  

代码如下:

  public static void main(String[] args) {//新版本 jdk产生代理类System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");// VIP 影厅《钢铁侠》IronManVIPMovie ironManVIPMovie = new IronManVIPMovie();InvocationHandler invocationHandler = new MyInvocationHandler(ironManVIPMovie);VIPMovie dynamicProxy = (VIPMovie) Proxy.newProxyInstance(IronManVIPMovie.class.getClassLoader(),IronManVIPMovie.class.getInterfaces(), invocationHandler);dynamicProxy.vipPlay();// 普通影厅《美国队长》CaptainAmericaMovie captainAmericaMovie = new CaptainAmericaMovie();InvocationHandler invocationHandler1 = new MyInvocationHandler(captainAmericaMovie);Movie dynamicProxy1 = (Movie) Proxy.newProxyInstance(CaptainAmericaMovie.class.getClassLoader(),CaptainAmericaMovie.class.getInterfaces(), invocationHandler1);dynamicProxy1.play();System.out.println("VIP 影厅《钢铁侠》代理类:"+dynamicProxy.getClass());System.out.println("普通影厅《美国队长》:"+dynamicProxy1.getClass());}

我们可以看到结果

电影开始前正在播放广告
VI影厅正在播放的电影是《钢铁侠》
电影结束了,接续播放广告
电影开始前正在播放广告
正在播放的电影是《美国队长》
电影结束了,接续播放广告
VIP 影厅《钢铁侠》代理类:class com.sun.proxy.$Proxy0
普通影厅《美国队长》:class com.sun.proxy.$Proxy1

产生了两个代理类分别是$Proxy0$Proxy1
下面们来看下"钢铁侠"的代理类$Proxy0

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package com.sun.proxy;import com.workit.demo.proxy.VIPMovie;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;public final class $Proxy0 extends Proxy implements VIPMovie {private static Method m1;private static Method m3;private static Method m2;private static Method m0;public $Proxy0(InvocationHandler var1) throws  {super(var1);}public final boolean equals(Object var1) throws  {try {return (Boolean)super.h.invoke(this, m1, new Object[]{var1});} catch (RuntimeException | Error var3) {throw var3;} catch (Throwable var4) {throw new UndeclaredThrowableException(var4);}}public final void vipPlay() throws  {try {super.h.invoke(this, m3, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final String toString() throws  {try {return (String)super.h.invoke(this, m2, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final int hashCode() throws  {try {return (Integer)super.h.invoke(this, m0, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}static {try {m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));m3 = Class.forName("com.workit.demo.proxy.VIPMovie").getMethod("vipPlay");m2 = Class.forName("java.lang.Object").getMethod("toString");m0 = Class.forName("java.lang.Object").getMethod("hashCode");} catch (NoSuchMethodException var2) {throw new NoSuchMethodError(var2.getMessage());} catch (ClassNotFoundException var3) {throw new NoClassDefFoundError(var3.getMessage());}}
},

通过上述代码我们可以看到 $Proxy0 extends Proxy implements VIPMovie继承了Proxy 且实现了VIPMovie接口,这也就是为什么jdk动态代理必须基于接口,java 是单继承的。
然后再看下代理类实现的方法:

 public final void vipPlay() throws  {try {super.h.invoke(this, m3, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}

这个supper.h.invoke Proxy中的h的invoke方法,即InvocationHandler.invoke也就是上面 MyInvocationHandler.invoke方法,至此整个流程就清晰了。这就是jdk的动态代理。

cglib动态代理

上面说jdk动态代理只能基于接口,那么如果是类要动态代理怎么办呢?cglib动态代理就可解决关于类的动态代理。
下面我们来创建一个“《美国队长2》”

package com.workit.demo.proxy;public class CaptainAmerica2MovieImpl {public void play(){System.out.println("正在播放的电影是《美国队长2》");}
}

引入cglib pom依赖

<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>

创建一个自定义MethodInterceptor。

package com.workit.demo.proxy;import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibProxyInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {playStart();Object object = methodProxy.invokeSuper(o, objects);playEnd();return object;}public void playStart() {System.out.println("电影开始前正在播放广告");}public void playEnd() {System.out.println("电影结束了,接续播放广告");}
}

测试类

package com.workit.demo.proxy;import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;public class CglibProxyTest {public static void main(String[] args) {// //在指定目录下生成动态代理类System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "C:\\class");//创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数Enhancer enhancer = new Enhancer();//设置目标类的字节码文件enhancer.setSuperclass(CaptainAmerica2MovieImpl.class);//设置回调函数enhancer.setCallback(new CglibProxyInterceptor());//这里的creat方法就是正式创建代理类CaptainAmerica2MovieImpl captainAmerica2Movie = (CaptainAmerica2MovieImpl)enhancer.create();//调用代理类的play方法captainAmerica2Movie.play();System.out.println("cglib动态代理《美国队长2》:"+captainAmerica2Movie.getClass());}
}

输出结果:

电影开始前正在播放广告
正在播放的电影是《美国队长2》
电影结束了,接续播放广告
cglib动态代理《美国队长2》:class com.workit.demo.proxy.CaptainAmerica2MovieImpl$$EnhancerByCGLIB$$5c3ddcfe

我们看下最终创建的代理类生成的play方法

public class CaptainAmerica2MovieImpl$$EnhancerByCGLIB$$5c3ddcfe extends CaptainAmerica2MovieImpl implements Factory {public final void play() {MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;if (var10000 == null) {CGLIB$BIND_CALLBACKS(this);var10000 = this.CGLIB$CALLBACK_0;}if (var10000 != null) {var10000.intercept(this, CGLIB$play$0$Method, CGLIB$emptyArgs, CGLIB$play$0$Proxy);} else {super.play();}}

从代理对象反编译源码可以知道,代理对象继承于CaptainAmerica2MovieImpl ,拦截器调用intercept()方法,
intercept()方法由自定义CglibProxyInterceptor实现,所以,最后调用CglibProxyInterceptor中的intercept()方法,从而完成了由代理对象访问到目标对象的动态代理实现。

  • CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
  • 用CGlib生成代理类是目标类的子类。
  • 用CGlib生成 代理类不需要接口。
  • 用CGLib生成的代理类重写了父类的各个方法。
  • 拦截器中的intercept方法内容正好就是代理类中的方法体。

总结

  • 代理分为静态代理和动态代理两种。
  • 静态代理,代理类需要自己编写代码写成。
  • 动态代理有jdk和cglib,代理类通过 Proxy.newInstance()或者ASM 生成。
  • 静态代理和动态代理的区别是在于要不要开发者自己定义 Proxy 类。
    动态代理通过 Proxy 动态生成 proxy class,但是它也指定了一个 InvocationHandler 或者 MethodInterceptor的实现类。
  • 代理模式本质上的目的是为了增强现有代码的功能。

结束

  • 由于自己才疏学浅,难免会有纰漏,假如你发现了错误的地方,还望留言给我指出来,我会对其加以修正。
  • 如果你觉得文章还不错,你的转发、分享、赞赏、点赞、留言就是对我最大的鼓励。
  • 感谢您的阅读,十分欢迎并感谢您的关注。
    在这里插入图片描述

参考
https://blog.csdn.net/m0_37314675/article/details/77850967
https://www.cnblogs.com/cC-Zhou/p/9525638.html
https://www.jianshu.com/p/4539e6d9f337


http://chatgpt.dhexx.cn/article/Px95XjhV.shtml

相关文章

【元宇宙系列】游戏与元宇宙(上)——元宇宙的胚胎发育期

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 文章目录 游戏&#xff0c;元宇宙的胚胎发育期棉花产业带动了工业革命游戏孕育了元宇宙 游戏是人类文明的起点。席勒说&#xff1a;“只有当人在充分意义上是人的时候&a…

一个读者大佬精心总结的阿里、腾讯、宇宙条大厂 Offer 面经和硬核面试攻略

作者&#xff1a;见习格子衫 去年11 月底&#xff0c;在经历了充分的思想斗争后&#xff0c;我终于下定决心寄出了三方&#xff0c;历时三个多月的秋招也终于尘埃落定。过去的三个多月里&#xff0c;面试时间可能只有一个月左右&#xff0c;剩下的两个多月的时间都在等待结果和…

热乎的宇宙条总部面经,已拿offer,速来围观

本文来自作者陈同学的分享&#xff0c;哈工大机械专业研究生。 说起我字节跳动的面试经历可以说一波三折的&#xff0c;我在字节有经历过「十轮」的面试经历。 我和字节跳动的渊源可以追溯到去年2019的10月份&#xff0c;当时我的水平很菜&#xff0c;由于怕进入字节的招聘系统…

巴比特 | 元宇宙每日必读:粤港澳大湾区出台首个“元宇宙10条”,“三个五百万”将扶持哪些赛道?...

摘要&#xff1a;4月6日&#xff0c;广州市黄埔区、广州开发区举行元宇宙创新发展新闻发布会&#xff0c;正式发布《广州市黄埔区、广州开发区促进元宇宙创新发展办法》&#xff08;以下简称“元宇宙10条”&#xff09;。“元宇宙10条”扶持范围涵盖技术创新、应用示范、知识产…

各厂内推整理 (新增宇宙条)| 第四期

点击上方“朱小厮的博客”&#xff0c;选择“设为星标” 从去年开始&#xff0c;整个互联网行业的态势就不容乐观&#xff0c;很多公司都停止了招聘甚至出现了大面积的裁员潮&#xff0c;找工作变得越来越困难。 皮皮应几位道友相邀&#xff0c;在几个月前建立了一个内推群&…

今日头条这么厉害,被称为宇宙条!到底用了什么牛逼技术!

作者 | 钟镇刚 链接&#xff1a;blog.csdn.net/mucaoyx/article/details/84498468 今日头条创立于2012年3月&#xff0c;到目前仅几年时间。从十几个工程师开始研发&#xff0c;到上百人&#xff0c;再到200余人。产品线由内涵段子&#xff0c;到今日头条&#xff0c;今日特卖&…

宇宙条一面:十道经典面试题解析

前言 大家好&#xff0c;我是捡田螺的小男孩。&#xff08;星标置顶田螺哥&#xff0c;学起来&#xff01;&#xff09; 有位朋友面试了宇宙条&#xff0c;后端方向。整理了这几道面试真题以及答案&#xff0c;如有错误&#xff0c;欢迎大家留言区讨论哈。金九银十冲刺&#x…

入职宇宙条之后,我知道了这些

本文分为字节跳动的工作和生活总结&#xff0c;带你近距离了解字节跳动&#xff01; 生活总结 吃 字节跳动公司有自己的食堂&#xff0c;小编在二楼办公&#xff0c;食堂在负一层。公司为所有员工提供免费三餐。 早餐的大概时间是9:00到10:30&#xff0c;所以早上到公司太早&am…

C语言特殊图案之菱形的三种方法---今日笔记

小小白第一次写CSDN的博客啦&#xff01; 第一次写正式的博客&#xff0c;大家凑合看吧&#xff0c;有什么问题可以留言哦。 题目&#xff1a;输出一个如下菱形图 方法一 &#xff0c;利用循环控制输出。 解题思路&#xff1a;计算出每行包括7个字符&#xff0c;其中有的是空…

c语言输出半个菱形

1.在屏幕上输出以下图案&#xff1a; * *** ***** ******* ********* *********** ************* *********** ********* ******* ***** *** * 分析&#xff1a; 看到这个图形我们就想到这是菱形的一半&#xff0c;但是又跟菱形的输出方法不太一样&#xff0c;在此无需考虑空…

C语言输出n行* (打印菱形)

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <Windows.h> int main(void) {//首先分析&#xff1a;用户输入的是奇数还是偶数//其次分析&#xff1a;选择偶数的话选择在上部分还是下部分少打一行//上…

C语言打印输出菱形(一次成型,不分上下部分)

代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> main() {int a,b,i, j;i -3;for (i-3; fabs(i)<4;i){a fabs(i);//a会经历3,2,1&#xff0c;0,1&#xff0c;2,3对应空格数量while (a>0){printf(" ");a--;}b(7-(2* f…

打印九行菱形php,c语言打印菱形

c语言打印菱形 C语言是一门面向过程的计算机编程语言&#xff0c;在初学中我们都是以命令行的方式运行c程序&#xff0c;下面看看如何编写一个c程序&#xff0c;在命令行中输出菱形吧。 推荐课程&#xff1a;C语言教程 源代码为&#xff1a;#include void main() { int n 6; i…

c语言输出菱形图案

菱形图案 #include <stdio.h> int main() {int N;int i,j,k;while(~scanf("%d",&N)){//前N1行for(i1; i<N1; i)//1~N1行{for(j1; j<N-i1; j)//第一次i时N个空格&#xff0c;第二次i时N-1个空格......{printf(" ");//输出空格}for(k1; k<…

C语言打印菱形超详细版本,逐句解析

c语言打印菱形图案_small_planet的博客-CSDN博客_打印菱形图案c语言 首先感谢上面的大佬给我的启示&#xff0c;本文是在上面大佬的版本下进行的优化。 在屏幕上输出以下图案&#xff1a; * *** ***** ******* ********* *********** ************* **…

vuex原理以及实现

vuex官方文档 Vuex是什么&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化 每一个 Vuex 应用的核心就是 store&#xff08;仓库&#xff09;。“sto…

Vuex①(简介、原理)

文章目录 什么是VuexVue版求和案例Vuex的工作原理 什么是Vuex Vuex&#xff1a;专门在 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种…

Vuex介绍 及 工作原理

Vuex介绍 及 工作原理 概念&#xff1a;专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对vue应用中的多个组件的 共享 状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任…

vuex原理解析并实现一个简单的vuex

vuex的作用 官方 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 个人理解 简单来说当我们使用 vue 进行项目开发的时候往往会遇到多个组件共享状态的情况…

VueX原理解析以及实现一个简单的Vuex

前言 前端以前是没有状态管理的&#xff0c;直到Fackbook提出一个叫Flux的概念&#xff0c;才有了状态管理。 以前前端是通过MVC模式管理代码&#xff0c;但后来我们使用例如Vue、React、Angular这类通过声明式开发的框架&#xff0c;发现状态很难管理&#xff0c;容易出现状…