当前位置: 首页 > news >正文

MVC 架构解析

认真对待每时、每刻每一件事,把握当下、立即去做。

MVC 模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。下面主要对 MVC 架构下的优化方案以及其项目结构解析。

img

一. MVC 相应层应该做什么?

1. 控制器(Controller)业务层

控制器(Controller)-->业务层, Model 与 View 层的中介,负责转发请求,对请求进行处理,把 Model 数据在 View 上展示出来。

主要职责:

  • 管理 View Container 的生命周期;
  • 负责生成所有的 View 实例,并放入 View Container;
  • 监听来自 View 与业务有关的事件,通过与 Model 的合作,来完成对应事件的业务;

2. 视图(View)展现层

视图(View) -->展现层,承载 UI 展示和事件响应(交互)。

主要职责:

  • 响应与业务无关的事件,并因此引发动画效果,点击反馈(如果合适的话,尽量还是放在 View 去做)等。
  • 界面元素表达;

3. 模型(Model)数据层

模型(Model) -->数据层,数据处理层,包括网络请求,数据加工,算法实现等。

主要职责:

  • 给 ViewController 提供数据;
  • 给 ViewController 存储数据提供接口;
  • 提供经过抽象的业务基本组件,供 Controller 调度;

img

4. 示例解析

在 iOS 中的 ControlllerUIViewController,所以导致很多人会把视图写在 Controller 中,如下图:

@implementation DemoViewController- (void)viewDidLoad {[super viewDidLoad];//setupUI//1.createViewUIView *view = [[UIView alloc]init];view.frame = CGRectMake(100, 100, 100, 100);view.backgroundColor = [UIColor orangeColor];[self.view addSubview:view];//2.createButtonUIButton *btn = [UIButton buttonWithType:UIButtonTypeInfoDark];btn.center = self.view.center;[self.view addSubview:btn];//3...
}

这种写法在我刚学习编程的时候也这样写过,先说这样写的好处,以及初学者为什么会这么写:

  • 比如按钮,可以在当前控制器直接 add target: 添加点击事件,在当前控制器内就能调用到点击方法,不需要设置代理之类的;
  • 比如要找某个界面,直接切到这个界面对应的 controller 就行,因为View 写在 Controller 里面,不用去别的地方找就这里有;
  • 比如一个 View,里面有一张图片,图片依赖于网络资源,这样写的好处,可以直接让 ViewController 中就能拿到资源,不需要传值;

缺点:

  • 导致 Controller 特别臃肿,里面代码特别多,视图一复杂起来,代码量可能过1000行,不好维护;
  • 写在 Controller 里无法复用,除非你在 VC2 里面 copy 当前 VC 中的 View 的代码;
  • 特别low!!会被懂架构的人瞧不起,喷你根本不是 MVC,是 MC 架构;

如何告别 MC 模式,真正走到 MVC

先给自己洗脑,iOSController 不是 UIViewController,而是普通的 Controller,没有 View。(很关键的一步)。

模块化划分,每个模块对应自己的一个 View,例如 Demo 模块,View 层里面有个 DemoView,将界面元素写到 View 中。

二. MVC 相应层之间如何通信?

img

1. View 层和 Controller 层双向通信

1.1 Controller 如何将数据传递到 View 层

  • 创建 View 的时候通过 View 的函数作为外部参数传进去。

1.2 View 层(用户事件)如何传递到 Controller 层

1.2.1 代理(delegate)

通过代理(delegate),代理委托模式通过定义协议方法实现解耦, View 只关心事件触发不处理具体逻辑;

// 1. 定义协议
@protocol CustomViewDelegate <NSObject>
- (void)customView:(UIView *)view didTapButton:(UIButton *)button;
@end// 2. View 持有 delegate 弱引用
@interface CustomView : UIView
@property (nonatomic, weak) id<CustomViewDelegate> delegate;
@end@implementation CustomView
- (void)buttonTapped:(UIButton *)sender {[self.delegate customView:self didTapButton:sender]; // 触发代理方法
}
@end// 3. Controller 实现协议
@interface ViewController () <CustomViewDelegate>
@end@implementation ViewController
- (void)viewDidLoad {CustomView *view = [[CustomView alloc] init];view.delegate = self; // 设置代理
}- (void)customView:(CustomView *)view didTapButton:(UIButton *)button {NSLog(@"Delegate: 按钮点击事件处理"); // Controller 响应事件
}
@end
1.2.2 target-action 监听

在 Controller 设置 target-action 监听,Controller 给 View 添加一个 target,当用户的触摸事件发生时,view 产生 action,Controller 接收到之后做出相应的响应,直接建立 View 与控制器的响应链关系,适合简单控件事件;

// 1. View 暴露添加 target 的方法
@interface CustomView : UIView
- (void)addTarget:(id)target action:(SEL)action;
@end@implementation CustomView {id _target;SEL _action;
}- (void)addTarget:(id)target action:(SEL)action {_target = target;_action = action;
}- (void)buttonTapped {#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-performSelector-leaks"[_target performSelector:_action withObject:self]; // 执行 Action#pragma clang diagnostic pop
}
@end// 2. Controller 设置 Target-Action
@implementation ViewController
- (void)viewDidLoad {CustomView *view = [[CustomView alloc] init];[view addTarget:self action:@selector(handleButtonTap:)]; // 绑定事件
}- (void)handleButtonTap:(CustomView *)sender {NSLog(@"Target-Action: 按钮点击事件处理"); // Controller 响应事件
}
@end
1.2.3 数据源模式 data source

通过数据源模式 data source,通过数据驱动 UI 更新,控制器实现数据获取协议供 View 调用;

// 1. 定义数据源协议
@protocol CustomViewDataSource <NSObject>
- (NSString *)textForButtonInView:(CustomView *)view;
@end// 2. View 持有 dataSource 引用
@interface CustomView : UIView
@property (nonatomic, weak) id<CustomViewDataSource> dataSource;
- (void)reloadData; // 触发数据更新
@end@implementation CustomView
- (void)reloadData {NSString *text = [self.dataSource textForButtonInView:self]; // 获取数据[_button setTitle:text forState:UIControlStateNormal];
}
@end// 3. Controller 实现数据源
@interface ViewController () <CustomViewDataSource>
@end@implementation ViewController
- (void)viewDidLoad {CustomView *view = [[CustomView alloc] init];view.dataSource = self;[view reloadData]; // 初始化数据
}- (NSString *)textForButtonInView:(CustomView *)view {return @"DataSource 模式"; // 提供动态数据
}
@end
1.2.4 Block(闭包)

Block(闭包):‌View 定义闭包属性,Controller 通过赋值闭包来响应事件。‌优点,代码紧凑,适合简单回调。‌缺点,需注意循环引用(使用 [weak self])。

class CustomView: UIView {var onButtonTap: (() -> Void)?@objc func buttonTapped() { onButtonTap?() }
}
// Controller 中赋值
customView.onButtonTap = { [weak self] in self?.handleTap() }

2. Model 层和 Controller 层双向通信

我们来看下这里的 Model 层通信,先看一段代码。

@implementation DemoViewController- (void)viewDidLoad {[super viewDidLoad];//loadDatas[[AFHTTPSessionManager manager]GET:urlparameters:parametersprogress:nilsuccess:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject){//刷新tableView_datas = responseObject;[_tableView reloadDatas];} failure:nil];
}

这种写法在我刚学习编程的时候也这样写过,先说这样写的好处,以及初学者为什么会这么写:

  • 简单,网络请求完,直接在当前控制器刷新 TableView 的数据源;
  • 比如要找某个界面的网络请求,直接切到这个界面对应的 controller 就行,因为数据请求 写在 Controller 里面,不用去别的地方找,就这里有;
  • 比如当前网络请求接口,需要外部参数,比如前一个界面的 uuid,这样写的好处,可以直接让当前请求在 Controller 中就能拿到资源,不需要传值;

缺点:

  • 又导致 Controller 特别臃肿,里面代码特别多,如果当前控制器需要多次请求,代码量可能过1000行,不好维护;
  • 写在 Controller 里无法复用,除非你在 VC2 里面 copy 当前 VC 中的 网络请求的代码;
  • 如果某些接口有依赖要求,接口1请求完再请求接口2,需要嵌套起来;
  • 特别 low!!会被懂架构的人瞧不起,喷你根本不是 MVC,如果你还用了上面的 View 写在 Controller 的操作的话,恭喜你,最终大法 - Controller 架构 顺利完成,并不需要什么 Model && View

iOSController 就算是 UIViewController,也没看到 Model 啊,没有 Model。(很关键的一步);

模块化划分,每个模块对应自己的一个 Model,例如 Demo 模块,Model 层里面有个 DemoModel,将网络请求&&数据处理写到 Model 中;

2.1 Controller 调用和传值到 Model

Controller 层直接调用 Model 层类方法和实例方法,并通过参数传值。

2.2 Model 层数据如何回调到 Controller 层

Model 层数据如何回调到 Controller 层,Controller 层如何知道 Model 层数据发生了改变。

2.2.1 Block 回调

轻量级单向通信,适合简单回调但需注意循环引用

//Model
@implementation DemoModel+ (void)fetchDatasWithUUid:(NSString *)uuid success:(successBlock)block{//Model发送网络请求NSDictionary *parameters = @{@"uuid":uuid}[[AFHTTPSessionManager manager]GET:urlparameters:parametersprogress:nilsuccess:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject){//通过block异步回调~block(responseObject);} failure:nil];   
}//Controller
@implementation DemoViewController- (void)viewDidLoad {[super viewDidLoad];//loadDatas[DemoModel fetchDatasWithUUid:_uuid success:^(NSArray *array) {_datas = array;[_tableView reloadDatas];}];
}
2.2.2 KVO(监听)

KVO(监听),监听 Model 的每个属性的变化来做出响应;

// Model.h
@interface MyModel : NSObject
@property (nonatomic, strong) NSString *data;
@end// Controller.m
- (void)viewDidLoad {[super viewDidLoad];[self.model addObserver:self forKeyPath:@"data" options:NSKeyValueObservingOptionNew context:nil];
}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {if ([keyPath isEqualToString:@"data"]) {self.label.text = change[NSKeyValueChangeNewKey]; // 响应变化}
}- (void)dealloc {[self.model removeObserver:self forKeyPath:@"data"];
}
2.2.3 Notification(通知)

Notification(通知),Model 中创建一个 NSNotificationCenter,在 Controller 中创建一个方法来接收通知。当 Model 发生变化时,他会发送一个通知,而 Controller 会接收通知,一对多广播式通信,适合跨模块解耦但性能开销较大。

img

解释一下上面这幅图,一个完整的模块被分为了三个相对独立的部分,分别是Model,View,Controller,对应到我们 App 中的依次为继承自 NSObject 的数据中心,承载 UI 展示和事件响应的 View 以及我们最最常用的 UIViewController。

其中 VC 持有 View 和 Model 部分,View 通过代理或者 Target-Action 的方式把用户的操作传递给 VC,VC 负责根据不同的用户行为做出不同响应。如果需要加载或刷新数据则直接调用 Model 暴露的接口,如果数据可以同步拿到,则直接使用获取到的数据刷新 View。如果数据需要通过网络请求等其他异步的方式获取,VC 则通过监听 Model 发出的数据更新(成功或失败)通知,在收到通知时根据成功或者失败对 View 进行相应的刷新操作。可以看出来整个过程中 View 和 Model 是没有直接交互的,所有的操作都是通过 VC 进行协调的。

基础的 MVC 讲解完毕,其实本质上就是让 Controller 减压,不该控制器管的他别让他知道,如上基础 MVC 操作之后的优势:

  • MVC 架构分明,在同一个模块内,如果视图有问题,找到该模块的 View 就行,其他同理,Controller 代码大大减少,负责 View 的代理事件就可以;
  • 可以复用,比如你一个产品列表的数据,首页也要用,产品页也要用,直接分别在其对应的 VC1 && VC2 调用函数 [ProductModel fetchDatas] 即可,无需写多次,View 的复用同理;
  • 结构分明,便于维护,拓展也是在此基础上拓展,代码干净简洁。

三. MVC 架构常见的疑惑

1. 遗失的网络逻辑(网络数据请求应该放在那里?)

苹果使用的 MVC 的定义是这么说的:所有的对象都可以被归类为一个 Model,一个 View,或是一个控制器。就这些,那么把网络代码放哪里?和一个 API 通信的代码应该放在哪儿?

你可能试着把它放在 Model 对象里,但是也会很棘手,因为网络调用应该使用异步,这样如果一个网络请求比持有它的 Model 生命周期更长,事情将变的复杂。显然也不应该把网络代码放在 View 里,因此只剩下控制器了。这同样是个坏主意,因为这加剧了厚重控制器的问题。那么应该放在那里呢?显然 MVC 的 3 大组件根本没有适合放这些代码的地方。

网络请求与数据处理的归属争议:

  1. ‌纯数据模型派:
    认为 Model 应仅定义数据结构,网络请求和数据处理应由 Controller 或单独的服务类(如 NetworkManager)处理。

  2. ‌增强 Model 派:

    支持将网络请求封装在 Model 内部,通过扩展方法或静态函数实现,例如:

    extension NGLoginModel {static func fetchAccount(completion: @escaping (NGLoginModel?) -> Void) {NetworkManager.request(url: "api/login") { data inlet account = NetcallAccount(data: data)completion(NGLoginModel(info: account))}}
    }
    

    这种方式保持数据与获取逻辑的紧密性,但可能增加 Model 的复杂度。

相关文章:

MVC 架构解析

认真对待每时、每刻每一件事,把握当下、立即去做。MVC 模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。下面主要对 MVC 架构下的优化方案以及其项目结构…...

鸿蒙应用开发从入门到实战(五):ArkUI概述

HarmonyOS提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。方舟开发框架可为开发者提供应用UI开发所必需的能力,比如多种组件、布局计算、动画能力、UI交互、绘制等。​ 大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持…...

好用的跨网文件安全交换系统:守护企业数据流转的核心屏障!

在数字化时代,企业数据跨网流转需求日益频繁,然而内网与外网的隔离、多安全域的划分,让文件传输面临效率与安全的双重挑战。传统方式如U盘拷贝易导致病毒传播和数据泄露,FTP等工具缺乏合规审计能力,难以满足企业对数据安全的高要求。因此一款好用的跨网文件安全交换系统,…...

SIM笔记

SIM组成 金属触点 + 塑料基板 + 芯片模块(封装在透明的环养树脂)+ 极细小的内部电路金属触点 C1: 输送电力(5V/3V/1.8/); C5:接地 形成回路; C3: 提供时钟信号; C2:复位信号触点; C7:数据传输; C4、C8: 预留 芯片模块 如何上网qq:505645074...

2025第五届“长城杯”网络安全大赛暨京津冀蒙网络安全技能竞赛 WP Web全

文曲签学 首先随便输入一个指令尝试,发现提示输入help查看帮助输入help,发现有list命令查看笔记和read命令读取笔记list查看笔记列表,发现HINT,read查看关注公众号后提示写的很明确了,目录穿越加双写绕过拿到flag EZ_upload 随便上传一个文件,跳转至upload.php查看源码 &…...

FTP替代工具哪个产品好,高效安全之选

内容概要 在探讨FTP替代工具哪个产品好时,我们不得不先概览一下当前的市场情况。随着企业对数据传输效率和安全性要求的日益提升,FTP这一传统工具已难以满足需求。市场上涌现出众多FTP替代产品,其中Ftrans SFT文件安全传输系统‌备受瞩目。本文将从高效传输速度和数据安全性…...

c++之内存对齐模板类aligned_storage

始于c++11,c++23弃用 aligned_storage 是 C++ 标准库中用于管理对齐内存的模板类,定义在 <type_traits> 头文件中。它通过模板参数指定内存大小和对齐方式,提供未初始化的内存区域,适用于需要精确控制内存布局的场景。核心功能 ‌内存对齐管理‌:通过模板参数设置…...

ABC 423先慢慢改吧题解

被模拟题狙击了,数组越界为啥不爆 RE 啊啊啊啊 整场白打,这是真导管了 C - Lock All Doors 想了半天是不是被边界情况卡了,鼓捣半天写了一堆等价的东西,屋檐了 记得检查数组大小 D - Long Waiting 可以维护一个小根堆来判断已经进入餐厅的客人离开的顺序,再记一个人数 \(s…...

汇聚层交换机的替换要考虑到的因素

背景: 当汇聚层交换机的流量端口承受不住现有流量,需要替换交换机实现业务正常工作。 考虑因素:现有网络架构:先梳理清现有网络架构,为后续工作打下坚实的基础。需要考虑业务需求、结构层次(汇聚层、接入层、核心层)、未来需求等; 交换机选型:硬件方面需要考虑适配性,…...

git 常见使用

取消git commit git reset --soft HEAD~1 文件名 取消git add git reset HEAD 文件名 强制分支B覆盖分支A git checkout A git reset --hard origin/B git push -f origin A...

python UV 包管理工具安装

安裝 uv uv 本身並不需要 Python,所以不建議用 pip 或是 pipx 安裝,這樣都會跟特定的 Python 環境綁在一起,Windows 上就直接透過 PowerSehll 安裝即可: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | scoop 安裝:scoop install u…...

什么是网络分区

目录背景和价值一、先搞懂:什么是Redis场景下的“网络分区”?二、同一交换机下,Redis主从发生网络分区的5个常见原因1. 节点自身的“网络硬件故障”2. 节点到交换机的“链路故障”3. 交换机自身的“功能故障”4. “网络风暴/拥堵”导致的“暂时性分区”5. 防火墙/安全软件的…...

完整教程:《驾驭云原生复杂性:隐性Bug的全链路防御体系构建》

完整教程:《驾驭云原生复杂性:隐性Bug的全链路防御体系构建》pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&quo…...

从机器的角度来说ECS为何性能好

ECS的写法,让数据的命中变高了,从而提高了CPU的使用数据的性能,因为ECS的数据是连续,批量的 而OOP的写法,数据是没有组织的,数据比较离散,要去多个cache里面去找,命中率低...

人生最幸福的时刻也就几个瞬间

1...

网络流笔记

流网络:有向图,有两个特殊点:源点,汇点。每条边有个流量。(不考虑反向边)我们可以假设流网络中不存在自环,即对于任意的节点 \(v\),\((v,v) /∈E\)。 我们同样可以假设流网络中不存在重边,即对于任意的节点 \(u\), \(v\),如果 \((u,v)∈E\), 那么 \((v,u) /∈ E\)。…...

实用指南:经典动态规划题解

实用指南:经典动态规划题解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...

2025杭电多校(2)

F https://acm.hdu.edu.cn/showproblem.php?pid=7996 题意 有两场比赛,统计对于每个 \(i\) ,有多少个人排在 \(i\) 的前面,需要去重。 思路 第一思路是统计每个位置 \(i\) 前面有多少人数,发现有个小容斥在这里,两场比赛排名前的总人数减去两场都在排名前的人数。 用树状…...

latex 打印生僻字

默认的字体格式很难打出生僻字. 我们可以使用ctex的其他字体. 首先要知道有哪些字体, 参考: https://www.cnblogs.com/wodedow/p/13845213.html. 比如我们要使用字体名称为AR PL KaitiM GB, 我们需要在usepackage区域加入下面的代码 \setCJKfamilyfont{font01}{AR PL KaitiM GB…...

CSP-S 2025 游记(The Last CSP ver.)

【洛谷专栏】。 前言 前作:CSP-S 2024 游记。 上一篇文章:2025 年南京大学计算机学科体验专题营 游记。 停课最早的一次,但是没有去年写的早,不过小问题。 与文化课告别的不突然,但仍有些不舍吧。也许未来不会再担任化学课代表了,化学老师真的对我很好(可怜。如果不是现…...

电机ADC采集

正点原直流有刷驱动板的硬件解说_直流有刷电机电流检测电路-CSDN博客电平移位电路设计(常用于将双极性的宽动态范围信号变成单极性窄动态范围的信号供ADC采集)-CSDN博客运放实现交流信号的放大与平移-CSDN博客...

道德经

1.道可道,非常道。名可名,非常名。无名天地之始;有名万物之母。2.天下皆知美之为美,斯恶已。皆知善之为善,斯不善已。3.有无相生,难易相成,长短相形,高下相盈,音声相和,前后相随。恒也。4.不尚贤,使民不争;不贵难得之货,使民不为盗;不见可欲,使民心不乱。是以圣…...

TokenFlow: Unified Image Tokenizer for Multimodal Understanding and Generation - jack

https://github.com/ByteVisionLab/TokenFlow https://arxiv.org/abs/2412.03069...

digitalworld.local: TORMENT - 实践

digitalworld.local: TORMENT - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...

8.25-9.2周报六

1111...

Go by Example(3.Variables)

package mainimport "fmt"func main() {var a = "initial"fmt.Println(a)var b, c int = 1, 2fmt.Println(b, c)var d = truefmt.Println(d)var e intfmt.Println(e)f := "apple"fmt.Println(f) }运行结果: $ go run variables.go initial 1 2 …...

小程序分包方法

1、 图片上云 2、 删除不用的代码、函数和文件 3、 只有子包需要的接口移到子包中 4、 代码复用。效果不明显,实现两个页面复用一个大组件,可减少10kB大小 5、 还未实践见到效果的备选方案:把node_modules、uni_modules(在微信开发者工具的依赖分析看项目依赖这两个目录中的…...

9.3-9.10周报七

111111...

pyinstaller打包整个文件文件夹和相关exe,三方库

#打包目的:完全脱离环境,只copy hello.exe去其他机器就可以完美运行#打包命令: pyinstaller --onefile .\xxx\hello.py --hidden-import "tkinter" --hidden-import=glob --hidden-import=lxml --add-data ".\xxx\*;." --distpath output_dir --add-…...

学习心得

初次接触Hadoop时,我被其庞大的生态系统所震撼 学习过程中,我最大的感悟是理论与实践的结合至关重要。单纯阅读MapReduce的原理或HDFS的架构设计,总感觉隔着一层迷雾。直到亲手搭建环境、编写第一个WordCount程序,看到分布式计算如何将大任务拆解到多个节点并行处理,那种豁…...

Web前端入门第 87 问:JavaScript 中 setInterval 和 setTimeout 细节

setInterval 和 setTimeout 两者都是用于控制 JS 函数延迟执行,但是在执行机制和用途上还是有点儿差异。 虽然说两者功能上有区别,但在使用上却可以相互模拟各自的功能,大胆的猜测下:也许浏览器内核底层都是同一个方法,只是上层封装出的两个语法糖而已。 语法 两者在语法上…...

基于Python+Vue开发的农产品商城管理系统源码+运行

项目简介该项目是基于Python+Vue开发的农产品商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的农产品商城管理系统项目,大学生可以在实践中学…...

多人多次并发

在测试行业一年多,接触到多人多次并发首先创建线程组在JMeter中添加线程组,设置线程数、Ramp-Up时间和循环次数,然后添加HTTP请求:配置目标服务器的IP、端口和路径,模拟用户的具体操作。通过CSV Data Set Config加载用户数据,实现动态参数化。 查看结果树收集测试数据。合…...

B. Alternating Current

https://codeforces.com/problemset/problem/343/B 题意:给定两根线,告诉你每个节点的两根线的上下位置,问两根线能否无损解开 思路:如果连续的一段一个都在另一个上面或者下面,那么这一段就可以回到他本身的位置。根据这个思路,可以将问题转化为消消乐问题,只要有连续的…...

虚拟电厂运行机制

虚拟电厂(VPP)对电力资源的调节是其最核心、最精妙的功能。它本质上扮演着一个“全能电力调度员”的角色,但其调度对象不再是几个大电厂,而是成千上万个分散的、类型各异的分布式资源。 1. 察:全面感知与实时监测 这是调节的基础。虚拟电厂通过安装在各类终端资源上的智能…...

创建我第一个带记忆能力的langchain机器人

以下内容由AI对话生成带记忆的聊天机器人实现 下面是完整的代码实现,包含详细注释: # chatbot_with_memory.py import os from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain …...

Reinforcing Image Generation with Collaborative Semantic-level and Token-level CoT - jack

https://arxiv.org/pdf/2505.00703 https://github.com/CaraJ7/T2I-R1...

GitHub超 30000+ star , 超强大的开源项目Supervision

Roboflow 的 Supervision 项目已于近期突破 30,000 个 GitHub Stars,是视觉工程师常用的辅助库,让你告别重复造轮子。 Supervision 是 Roboflow 出品、基于 MIT 协议的开源库,用于解决视觉项目中常见的可视化、跟踪、计数、格式转换等需求。可与 YOLO、Detectron2、Transfor…...

深入解析:【JavaEE】网络原理初识

深入解析:【JavaEE】网络原理初识pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

Office文档投毒技术:SHVE中的会话劫持视觉利用新突破

本文深入解析SHVE工具如何通过Office文档投毒技术,利用XSS漏洞和用户对可信网站的信任,在文档下载过程中自动注入恶意宏,实现隐蔽的攻击载荷交付,揭示了现代网络攻击中技术利用与心理信任结合的新型威胁模式。Office文档投毒在SHVE中的应用 大家好!我们带来了会话劫持视觉…...

爬虫逆向--Day22Day23--核心实战案例【荔枝网】【WASM学习】

案例地址链接:https://gdtv.cn/channels/2 案例爬取链接:https://gdtv-api.gdtv.cn/api/channel/v1/news?beginScore=0&channelId=246&pageSize=11 一、入口定位 首先当我们拿到网站,并且找到我们需要爬取的目标url以后,我们首先复制url到【https://curlconverter…...

简洁美观!一款值得 Star 的 Java 博客项目!

OneBlog —— 一个简洁美观、功能强大并且自适应的 Java 博客。基于 SpringBoot + Bootstrap 开发,支持移动端自适应,配有完备的前台和后台管理功能。大家好,我是 Java陈序员。 今天,给大家介绍一个简洁美观的开源 Java 博客系统。关注微信公众号:【Java陈序员】,获取开源…...

数据结构与算法-33.图-加权有向图最短路径

一、加权有向图 1、加权有向图 边的表示 代码实现 2、加权有向图的实现 二、最短路径 1、定义及性质 2、API设计 3、松弛技术4、Dijkstra算法实现 测试以上仅供参考,如有疑问,留言联系...

白子的情人节礼物

新题崭新出炉题面背景 我永远喜欢砂狼白子! ----MyShiroko 白子最近有点烦恼,因为她敏锐的嗅觉闻到了星野前辈身上有老师的味道。(详见《一日一星野》) 在多次询问星野无果的情况下,她打算直接去夏莱找老师问个清楚。 不过最近情人节快到了,白子决定拿着一些礼物,所以她…...

白子的情人节礼物 题解

咕咕点击查看代码 #include<bits/stdc++.h> #define int long long #define Blue_Archive return 0 #define con putchar( ) #define ent putchar(\n) using namespace std; constexpr int N = 5e5 + 7; constexpr int M = 8e5 + 7; constexpr int INF = 1e18;int n; in…...

Ubuntu上进行Zookeeper集群部署

Ubuntu系统上Zookeeper集群部署安装目录1.zookeeper下载2.zookeeper安装与使用3.zookeeper启动4.zookeeper是什么?为什么要用它?为什么不用Hbase自带的? 1.zookeeper下载 版本无特别要求,一般最新稳定版即可。 这里给出3.8.4的下载链接。(点击即可直接下载) zookeeper官网…...

The Landscape of Agentic Reinforcement Learning综述 - jack

The Landscape of Agentic Reinforcement__Learning for LLMs.pdf https://medium.com/data-science-in-your-pocket/the-landscape-of-agentic-reinforcement-learning-for-llms-a-survey-ed96182d3ed1...

A Survey of Reinforcement Learning for Large Reasoning Models - jack

https://arxiv.org/abs/2509.08827 https://huggingface.co/papers/2509.08827...

r-nacos支持mcp,内置mcp server支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。

r-nacos支持mcp,内置mcp server与接口转发;支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。r-nacos支持mcp,内置mcp server与接口转发;支持让注册到r-nacos的普通http接口通过r-nacos直接转化成mcp服务对外提供服务。 适用场景 如果你有一个…...

MacOS下微信小程序抓包教程

前言 换mac了,折腾一天抓包,终于成功抓上了。 BurpSuite下载: https://www.52pojie.cn/thread-2005151-1-1.html proifier下载:https://www.proxifier.com/ proifier注册机:https://github.com/y9nhjy/Proxifier-Keygen 一、安装proifier 先正常安装proifier本体,打开注册…...