
Android
文章平均质量分 90
大模型微调部署
这个作者很懒,什么都没留下…
展开
-
Android入门到精通,零基础必备
Android是一种基于Linux的自由及开放源代码的操作系统,Android 分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。Android开发前途还是不可限量的,剩下的便是只有自己努力去攀登,只要学习上进,在未来的道路发展上也有无限的可能性。以上知识点都已整理打包好,有需要的同学,扫描下方二维码,免费领取!!!原创 2023-03-11 17:34:37 · 794 阅读 · 0 评论 -
Flutter异步与事件监听
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。原创 2023-03-11 17:33:21 · 721 阅读 · 0 评论 -
Android 异常重启--踩坑归来--干货篇
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。原创 2023-03-09 17:14:59 · 951 阅读 · 0 评论 -
保姆级Flutter完整开发实战详解,你确定不来了解一下?
本篇将带你深⼊了解 Flutter 中的⼿势事件传递、事件分发、事件冲突竞争,滑动流畅等等的原理,帮你构建⼀个完整的 Flutter 闭环⼿势知识体系,这也许是⽬前最全⾯的⼿势事件和滑动源码的深⼊⽂章了。本篇是主要讲述 Flutter 开发过程中的实⽤技巧,让你少⾛弯路少掉坑,全篇属于很⼲的⼲货总结,以实⽤为主,算是在深⼊原理过程中穿插的实⽤篇章。的学习资料,里面详细的讲解了知识点并结合实例,能让你快速的get到Dart语言,与此同时,也能系统的学习Flutter。最后,祝大家学习愉快!原创 2023-03-07 17:44:59 · 809 阅读 · 0 评论 -
Android Framework | 读懂异常调用栈
本文属于一个很小的知识点。但再小的知识点,都有值得深挖的必要。只有一次次深入地挖凿,才能构筑起坚实的技术堡垒。作者:卢半山原文链接:(https://juejin.cn/post/7154301024482623519)如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。原创 2023-03-06 17:49:27 · 2008 阅读 · 0 评论 -
百万人热议:前几天华为的面试通过了,但是HR告诉我签的是华为慧通的,我该不该去?
这是今天在逛某乎的时候,系统推送的一个问题。可能是平时关注这类问题多,被系统抓住了。下面是完整问题复现。提问人自述情况如下:西南地区,我目前三年工作经验,接电话的时候说是华为终端,HR告诉我面试通过之后,说签约要先签北京外企的,我这个岗位是晚点转签华为慧通,但是工作对接和职级晋升都是华为的,目前还没告诉我薪资情况,上网查了一下,有说是为了保持华为的高大上形象,低级员工就会在慧通,我目前工作不算差,在原公司待了两三年的样子,同事相处也可以,不知道值不值得我跳槽过去?原创 2023-02-27 20:26:45 · 15720 阅读 · 1 评论 -
关于程序员今年的“金三银四”被网友们称为“铜三铁四”这回事.......
去面试吧面不被录用的试面hr为了完成任务的试面一轮二轮没有下文试面需要通勤2小时的试面随时加班的试原创 2023-02-27 16:41:11 · 602 阅读 · 0 评论 -
Kotlin Flow 探索
CoroutineScope 会跟踪它使用 launch 或 async 创建的所有协程。您可以随时调用 scope.cancel() 以取消正在进行的工作(即正在运行的协程)。在 Android 中,某些 KTX 库为某些生命周期类提供自己的 CoroutineScope。例如,ViewModel 有 viewModelScope,Lifecycle 有 lifecycleScope。不过,与调度程序不同,CoroutineScope 不运行协程。Kotlin 提供了为 UI 组件使用的。原创 2023-01-13 11:46:21 · 253 阅读 · 0 评论 -
LockSupport实现原理
前文中了解到AQS借助LockSupport.park和LockSupport.unpark完成线程的阻塞和唤醒,那么LockSupport内部又是怎么实现的?这是一个什么类?LockSupport是用于使用锁阻塞线程的基础实现,是其他同步类的基础,这个类为每个使用它的线程关联一个许可证(有点类似于Semaphore),如果许可证可用,线程调用park方法时会立即返回,线程正常执行,否则当前线程阻塞,直到有其他线程调用unpark使得许可证可用,此时线程被唤醒,再次尝试获取许可证,其内部定义的park和原创 2023-01-12 10:28:06 · 218 阅读 · 0 评论 -
Flow 转 LiveData,数据丢了,肿么回事?
最近我在负责一段代码库,需要在使用Flow的 Data 层和仍然依赖LiveData暴露 State 数据的 UI 层之间实现桥接。好在框架已经提供了一个叫做的方法,可以让你毫不费力地将Flow转为LiveData。在拥有一个及以上活跃的观察者的条件下,它才会发射数据。假使上游的 flow 产生了更新,但对应的 LiveData 并非活跃的状态,那么它将无法获得最新的数值。让我通过如下的实例,向你展示我们可能会遇到的这种潜在问题。请时刻记住采用方法转换Flow得到的LiveData。原创 2023-01-11 10:51:15 · 420 阅读 · 0 评论 -
Android自定义View交互进阶,价格区间选择控件
之前我们的复习中,我们已经对原生 Canvas 的绘制有了详细的了解,我们对事件的处理也有了简单的了解,这一期我们就对绘制与事件的处理做更进一步的实现。如图,我们需要做这么一个区间的选择控件,此控件也是我们常用的控件,在一些筛选页面,根据价格,数值进行一些筛选的时候,我们需要设置一个最小值和一个最大值。然后取一段中间的区间值。而这个控件的实现就是典型的自定义绘制与自定义事件处理的标志性实现。我愿称之为自定义View的筑基练习,如果大家能从头到尾实现一遍,那么对自定义流程基本上已经驾轻就熟了原创 2023-01-07 21:43:48 · 373 阅读 · 0 评论 -
IM会话列表刷新优化思考
DiffUtil比较两个数据源(一般是List)的差异(Diff),Callback中比对时传递的参数是 positionSortedList能完成数据集的排序和去重,Callback中比对时,传递的参数是ItemData都能完成自动定向刷新 + 部分绑定,一种自动定向刷新的手段DiffUtil: 检测不出重复的,会被认为是新增的DiffUtil高级用法支持子线程中处理数据,而SortList不支持。原创 2023-01-05 22:15:03 · 750 阅读 · 0 评论 -
循序渐进的讲解用Android Jetpack Compose 写一个B站“一键三连”按钮动画, 愿新的一年好运连连
从本文你可以学习到以下知识点:* 如何快速学会用Compose进行布局* 理解`Composable`函数中数据驱动UI的编程思想, 理解`remember`函数的作用* 理解函数副作用, 编写动画原创 2023-01-04 22:10:35 · 314 阅读 · 0 评论 -
Android实现RecyclerView嵌套流式布局
Android开发中,列表页面是常见需求,流式布局的标签效果也是常见需求,那么两者结合的效果啥样呢?这篇文章简单实现一下。如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。原创 2022-12-30 21:19:14 · 1038 阅读 · 0 评论 -
掌握这17张图,没人比你更懂RecyclerView的预加载
我们为了减少描述问题的维度,于演示之前附加了许多限制条件,比如禁用了RecyclerView的预拉取机制。实际上,_**预拉取(prefetch)机制**_作为RecyclerView的重要特性之一,常常与缓存复用机制一起配合使用、共同协作,极大地提升了RecyclerView整体滑动的流畅度。并且,这种特性在ViewPager2中同样得以保留,对ViewPager2滑动效果的呈现也起着关键性的作用。因此,我们ViewPager2系列的第二篇,就是要来着重介绍RecyclerView的预拉取机制。原创 2022-12-29 22:01:42 · 1027 阅读 · 0 评论 -
Android 系统报告收集和查看
开发中接触的除了代码以外,最多的可能就是日志的。 像Android日志查看,最简单的就是这样:```adb logcat```然后系统日志就会源源不断的在控制台输出,其中包含了各种我们关心的重要的调试信息。原创 2022-12-27 22:13:20 · 3715 阅读 · 0 评论 -
Flutter通信机制——Platform Channel工作原理
的源码,会发现整个通信机制还挺简单的,先去不去理解Codec的话,等于就是将dart的变量,传到dart Native,然后交到java Native, 再传到java。在Flutter与Native混合开发的模式下,Platform Channel的应用场景非常多,理解Platform Channel的工作原理,有助于我们在从事这方面开发时能做到得心应手。来实现的,只是两端的handler会有一些特殊的处理方式,这个倒是与通信没有多大关系了,不过设计的也很简单,比较有意思。这个结构的,其他的也是走的。原创 2022-12-26 22:06:01 · 940 阅读 · 0 评论 -
Android面试题及答案整理(2023最新版)持续更新中......
Java方面Android方面音视频Flutter算法Android Framework企业常见174道面试题原创 2022-12-22 16:55:27 · 6316 阅读 · 0 评论 -
SharedPreferences源码分析
接到一个开发需求,需要定制化开发一个安全音量功能;此前有了解过为了符合欧盟等有关国家和地区的规定,原生Android是有自带一个安全音量功能的,想要定制则先要了解这个功能原先长什么样子,下面我们就从一个系统工程师的角度出发去探寻一下,原生Android的安全音量功能是如何实现的。原创 2022-12-21 17:24:38 · 633 阅读 · 0 评论 -
继续谈谈从Rxjava迁移到Flow的背压策略
对于背压问题不久前就讨论过了,这里就不过多介绍了,总之它是一个非常复杂的话题,本文的主要目的是分析我们如何从Rxjava迁移到Flow并且使用其背压方案,由于本身技术的限制以及协程内部的复杂性,不会做过多的深入讨论,只是通过类似黑盒测试的方式,给出一些示例比较它们之前存在的差异以及如何去使用不同的背压解决方案。鉴于RxJava和协程的实现差异,每个示例的实际输出基本都不会相同,这些示例的目的是说明它们之间处理背压的不同策略。本文会侧重于从Rxjava的角度出发去对比Flow。原创 2022-12-20 17:12:54 · 897 阅读 · 0 评论 -
binder调用流程分析
图中左边是客户端,右边是服务端,客户端想要调用服务端的call函数,首先我们需要先将函数名称以及参数值进行序列化,然后再使用linux系统所提供的跨进程通信方式,例如socket或者是管道,将这些序列化过后的数据传递给服务端,然后服务端拿到这些数据之后,首先进行反序列化,然后再调用相应的函数,将返回值返回给客户端。接着会回掉到java层的onTransact方法,如下注释1所示,this.getBitmap(_arg0)为Stub类的方法,从服务端获取到图片,然后在注释2处,将bitmap写入到返回值。原创 2022-12-16 21:44:50 · 1142 阅读 · 0 评论 -
App 黑白化技术实践
很高兴遇见你~最近打开各大 App 会发现它们都做了黑白化,如下支付宝的处理:可以看到应用设置了全局灰色调,表达了一种对逝者的哀悼,非常的应景和人性化。作为程序猿,我们来探索一下它从技术角度是怎么实现的。本篇文章我们介绍了:1、App 黑白化实现原理:将 Paint 的饱和度设置为 0,然后进行 View 的绘制2、App 黑白化两种方案实践:1、对页面的 DecorView 进行黑白化设置2、替换页面的内容栏 FramLaout 为黑白化 FrameLayout。原创 2022-12-15 21:16:46 · 856 阅读 · 2 评论 -
这10张图拿去,别再说学不会RecyclerView的缓存复用机制了
ViewPager2是在RecyclerView的基础上构建而成的,意味着其可以复用RecyclerView对象的绝大部分特性,比如缓存复用机制等。作为ViewPager2系列的第一篇,本篇的主要目的是快速普及必要的前置知识,而内容的核心,正是前面所提到的RecyclerView的缓存复用机制。RecyclerView,顾名思义,它会。具体而言,,这种重用可以:避免重复创建不必要的视图避免重复执行昂贵的findViewById从而达到的改善性能、提升应用响应能力、降低功耗的效果。原创 2022-12-14 21:45:13 · 531 阅读 · 0 评论 -
Android自定义ViewGroup布局进阶,完整的九宫格实现
如何把填充布局的逻辑抽取出来呢?每次初始化九宫格的时候就把九个布局全部添加进来,先测量布局了再说,然后通过暴露的方法隐藏多余的布局。通过一个定义一个数据适配器Adapter,内部封装一些逻辑,让具体实现的类去完成具体的逻辑。两种方法都可以,没有好坏之分。但是使用数据适配器的方案由于内部的View会少,性能会好那么一丢丢,总体来说差别不大。原创 2022-12-13 21:13:25 · 2306 阅读 · 0 评论 -
Android Framework | 消息机制的冷门知识点
作为Android的基础知识,消息机制已被无数人写过。笔者曾经也写过一篇深入分析的文章,但总体而言乏善可陈,并无新颖之处。最近恰好重新整理了一下思路,想着可以从细节的角度出发,对一些冷门的知识点做一个归纳。记录于此,供大家批评讨论。假设线程1此时正在处理一个消息,线程2通过如下方式(方式Ⅰ)往线程1的消息队列中插入两个消息。请问消息A和消息B哪个先被处理呢?那如果是通过下面这种方式(方式Ⅱ),消息A和消息B又是哪个先被处理呢?答案是通过方式Ⅰ发送时,消息A先被处理;通过方式Ⅱ发送时,消息B先被处理。具体原创 2022-12-06 16:24:07 · 1292 阅读 · 0 评论 -
Android Framework | 读懂异常调用栈
本文属于一个很小的知识点。但再小的知识点,都有值得深挖的必要。只有一次次深入地挖凿,才能构筑起坚实的技术堡垒。原创 2022-12-02 21:35:27 · 3371 阅读 · 0 评论 -
Android中关于电话的操作
拨打电话如果指定的 action 是 ,表示打开拨号界面,是不需要声明权限的。这里指定的是 ,表示直接拨打电话,因此必须声明权限电话状态有 3 种:1、空闲状态。2、振铃状态。3、接听状态。如何使用代码监听电话状态? 1、编写一个类,扩展自 PhoneStateListener 2、编写父类相关的监听方法 3、获取 TelephonyManager 电话管理器 4、manager.listen(listener,event);开启监听 5、清单文件中注册权限 android.permission.RE原创 2022-06-15 21:54:49 · 1079 阅读 · 0 评论 -
Android 主线程一定是 UI 线程吗?
事情的起因是这样的,在看官方文档的时候,遇到了这么一句话:在线程注解的章节中,也有一句话:从 入手,查看系统源码:这里判断了当前线程不是 mUiThread ,就用 Handler 发送消息,否则直接调用 run 方法。把焦点放在 mUiThread 上,看看它的初始化:这里的 mUiThread 直接被赋值为当前线程,而这个方法中又多了一个可疑对象 mMainThread ,它的值来自于 attach 的参数,而且还是个 ActivityThread 类型。 这两个属性从名字上看就可以理解为什么会有原创 2022-06-13 21:47:57 · 1338 阅读 · 0 评论 -
【Kotlin疑惑】在Kotlin类中重载一个算术运算符,并把该运算符声明为扩展函数会发生什么?
此时调用’+'运算符报错如下对错误进行解读 由于接收者类型无法匹配导致无法从候选方法中找到可以应用的分析三种不同方式重载的plus函数把kotlin代码反编译成java代码 通过反编译后我们可以发现此时plus函数处于PointKt类中,这也符合了我们之前篇章中说到“扩展函数并不是类的一部分,而是声明在类之外的”,在java中它把这个函数声明在了有着相似类名的类中,并且是一个静态函数。作为拓展函数的plus有着两个参数,kotlin在调用’+'时在java中被编译成下图[外链图片转存失败,源站可能有防盗链机原创 2022-06-09 21:44:21 · 233 阅读 · 0 评论 -
【Kotlin学习】运算符重载及其他约定——重载算术运算符、比较运算符、集合与区间的约定
定义一个plus运算符注意!如何使用关键字来声明plus函数。用于重载运算符的所有函数都需要用该关键字标记,用来表示你打算把这个函数作为相应的约定的实现,并且不是碰巧地定义一个同名函数在使用了operator修饰符声明了plus函数后,你就可以直接使用+号来求和除了把这个运算符声明为一个成员函数外,也可以把它定义为一个扩展函数这是给第三方库的类定义约定扩展函数的常用模式自定义类型的运算符,基本上和标准数字类型的运算符有着同样的优先级从java调用kotlin的运算符只需要像普通函数那样调用它们就行。当k原创 2022-06-07 22:03:37 · 249 阅读 · 0 评论 -
【Kotlin学习】类、对象和接口——定义类继承结构
下图声明了一个拥有名为click的单抽象方法的接口,所有实现该接口的非抽象类都要提供这一方法的实现kotlin使用冒号代替了extends和implements关键字,和java一样,一个类可实现多个接口但只能继承一个类在kotlin中使用override修饰符是强制要求的,这会避免先写出实现方法在添加抽象方法造成的意外重写接口的方法可以有一个默认实现,在Java8中需要你在这样的实现上标注default关键字,而kotlin没有特殊的注解,只需要提供一个方法体现在再定义一个Focusable接口,其原创 2022-06-02 21:48:03 · 266 阅读 · 0 评论 -
【Kotlin学习】类、对象和接口——带非默认构造方法或属性的类、数据类和类委托、object关键字
在java中一个类可以生命一个或多个构造方法,kotlin也一样,但做出了一点修改,它区分了主构造方法(通常是主要而简洁的初始化类的方法,并且在类体外部声明)和从/次构造方法(在类体内部声明)。同样也允许在初始化语句块中添加额外的初始化逻辑在kotlin基础中我们见过如何声明一个类通常来讲,类的所有声明都在花括号中,而这一段被括号围起来的语句块叫作主构造方法。它有两个目的1.表明构造方法的参数2.定义使用这些参数初始化的属性。可以编写的用来完成同样事情的最明确的代码关键字用来开始一个主构造方法或从构原创 2022-05-31 22:00:22 · 339 阅读 · 0 评论 -
【Kotlin学习】Lambda编程——序列、使用Java函数式接口、with和apply函数
惰性集合操作:序列map和filter函数会及早的创建中间集合,也就说每一步的中间结果都被存储在一个临时列表。序列给了你执行这些操作的另一种选择,可以避免创建这些临时中间对象。filter和map都会返回一个列表,这意味着上图的链式调用会创建两个列表:一个保存filter函数的结果,一个保存map函数的结果。当元素很多时这种方式非常低效把操作变成序列 上图没有创建任何用于存储元素的中间集合kotlin惰性集合操作的入口就是Sequence接口,这个接口表示一个可以逐个列举元素的元素序列,它只提供原创 2022-05-25 17:25:29 · 325 阅读 · 0 评论 -
【Kotlin学习】Kotlin中的注解
声明并应用注解应用注解在kotlin中使用注解的方法和java一样,以@字符作为注解名字的前缀,并放在要注解的声明的最前面使用JUnit框架可以用@Test标记一个测试方法注意!在AndroidStudio中想要使用该注解需要到对应的test目录中才能标记成功@Deprecated注解它的含义和java中一样,kotlin用replaceWith参数增强了它,让你可以提供一个替代者的(匹配)模式,以支持平滑地过渡到API新版本 实参在括号中传递,就和常规函数的调用一样。用了这种声明后,若有原创 2022-05-23 16:52:14 · 3455 阅读 · 0 评论 -
【Kotlin学习】Kotlin的类型系统——基本数据类型和其他基本类型、集合与数组
基本数据类型和其他基本类型基本数据类型:Int、Boolean及其他kotlin并不区分基本数据类型和包装类型,你使用的永远是同一个类型。在运行时,数字类型会尽可能地使用最高效的方式来表示。Int类型会被编译成java基本数据类型int。不可行的例外是泛型类,比如集合。用作泛型类型参数的基本数据类型会被编译成对应的java包装类型。整数类型——Byte、Short、Int、Long浮点数类型——Float、Double字符类型——Char布尔类型——Boolean可空的基本数据类型:Int?、原创 2022-05-19 17:14:19 · 740 阅读 · 0 评论 -
kotlin嵌套,扩展,继承-构造函数,
1,Java不能函数内部定义函数;为什么要有嵌套函数?让一些代码块独立,不让外部和内部的其他方法访问,但要注意:(1)如果嵌套函数内部想访问其他嵌套函数,必须是在其他嵌套函数定义之后;(2)嵌套函数可以访问外部的属性。2,kotlin与Java一大区别:扩展函数与属性。思考:如何在已有类基础上添加属性和方法?继承,扩展,(一)扩展方法kotlin&Java默认没有open的就是final的,即不能被继承,也就无法通过继承添加属性和方法eg:String类,并且系统默认的final或op原创 2022-05-17 17:47:57 · 295 阅读 · 0 评论 -
如何用 Kotlin + 动画 快速实现一款游戏,快速上手
前言前些日子开发过一款小游戏,kotlin快速实现一款小游戏,糖果雨来啦,但由于时间的原因,只开发完成了基础版。如今,我对它进行了升级,新增了进阶版与困难版,分享给大家。成果展示现在这款游戏包含三个版本,分别为:基础版:糖果只会在屏幕最上方生成,然后从上往下掉落。进阶版:糖果只会在屏幕中间生成,然后向四周发散困难版:糖果会在屏幕四个角随机生成,然后向大致对角方向发散。基础版进阶版困难版[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Xt原创 2022-05-13 17:23:30 · 1089 阅读 · 0 评论 -
认知篇----C语言中面向对象的核心思想之经典
一、前言在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式。虽然C++语言是从C语言发展而来的,但是今天的C++已经不是当年的C语言的扩展了,从2011版本开始,更像是一门全新的语言。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iz8XwuWj-1652278038882)(https://juejin.cn/ “点击并拖拽以移动”)]那么没有想过,当初为什么要扩展出C++?C语原创 2022-05-11 22:07:36 · 435 阅读 · 0 评论 -
Compose版来啦,高仿微信朋友圈大图缩放、切换、预览功能
最近在学习Jetpack Compose,想着能否用Jetpack Compose实现微信一些重要界面以及功能。好消息是已经实现了微信聊天界面相关功能以及交互,最近又搞了搞朋友圈的整体交互,网上看了看,关于compose动画相关知识比较少,所以打算通过最近学习的compose手势动画相关知识实现该功能。本文主要讲述如何通过compose手势动画实现微信大图缩放、切换、预览功能。先上动图在实现上述功能时首先我们需要了解一下 Compose 为我们提供的一些手势动画。使用PointerInput Mo原创 2022-05-09 21:03:38 · 2660 阅读 · 3 评论 -
「设计模式(二) - 观察者模式」
一、回复TD退订日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的。没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察者模式(Observer Pattern)如出一辙。更贴切的像初中时代,英语学习的周报订阅,一个班级大部分还是会订阅,基本上一周一期。这个算是比较典型的观察者模式也即-发布-订阅。可以这样理解,Publishers+Subscribers=Obeserver Pattern。像这种一对多的关系,一个对象状态的改变,所有订阅它的对象都会被通知到并进原创 2022-02-25 13:44:01 · 398 阅读 · 0 评论