概念实践极速入门 - 常用的设计模式 - 简单生活例子
概念实践极速入门 - 常用的设计模式 - 简单生活例子
SOLID 五大设计原则的首字母缩写
单一职责原则 和 开闭原则 就省略啦, 这两个概念很简单, 为了写而写反而容易误导人~* 鼓励大家字面理解
!
// 哎呀还是解释吧
单一(S): 单干一件事; 开闭(O): 拓展开放, 修改关闭!
里氏替换原则(L)
-
仅仅发生在 继承 体系中
-
子类不能影响父类独有行为
-
例
:对象构建自由与必要顺序规范鸵鸟不能飞但是继承到了鸟具有了飞的行为
-
错误示范
:对象构建自由与必要顺序规范重写飞的方法改成 -> ‘跑’
不能重写父类稳定的行为
-
-
-
接口隔离原则(I)
-
- 方式一
- 对象构建自由与必要顺序规范承担非自身职责的行为 抽象为接口, 选择性依赖
-
- 方式二
- 对象构建自由与必要顺序规范接口默认行为空实现
依赖倒置原则(D)
- 高层模块不应该依赖低层模块
-
高层模块
:业务层, 应该依赖的实现是抽象
-
高层模块另一种解释
:被调用方
-
-
迪米特原则(最少知识原则)- 拓展
- 核心
:只与直接朋友对话,减少模块耦合 - 场景
:订单服务不应直接调用库存DAO
// 错误示范:用户直接查货车司机信息
class User {void trackDelivery(Order order) {// 用户竟然能拿到货车司机电话!过度暴露细节System.out.println("货车司机电话:" + order.getTruck().getDriver().getPhone());}
}// 正确做法:用户只能问订单物流状态
class User {void trackDelivery(Order order) {// 用户只需和订单对话System.out.println("物流状态:" + order.getDeliveryStatus()); }
}// 订单类封装物流细节
class Order {private Delivery delivery;String getDeliveryStatus() {// 内部处理复杂查询:订单→货车→司机→位置return "司机" + delivery.getDriverName() + "正在" + delivery.getCurrentLocation();}
}
合成复用原则 - 拓展
- 核心
:优先用组合,其次继承 - 反例
:通过继承扩展日志功能(导致类爆炸)
// 错误示范:继承实现加料
class Americano {}
class AmericanoWithSugar extends Americano {} // 类爆炸开始
class AmericanoWithMilk extends Americano {}
class AmericanoWithSugarAndMilk extends Americano {} // 已经失控...// 正确示范:组合调料(合成复用)
class Coffee {private List<String> toppings = new ArrayList<>(); // 组合容器// 动态加料public void addTopping(String topping) {toppings.add(topping);}public void show() {System.out.println("咖啡加料:" + String.join("+", toppings));}
}// 使用
Coffee coffee = new Coffee();
coffee.addTopping("糖");
coffee.addTopping("奶油");
coffee.show(); // 输出:咖啡加料:糖+奶油
设计模式 - 场景 与 极简摘要
一、工厂模式:创建订单
概念
:抽象共同依赖实现,通过子类决定最终逻辑
// 抽象产品接口
public interface Order {void create();
}// 具体产品:普通订单
public class NormalOrder implements Order {@Overridepublic void create() { System.out.println("创建普通订单"); }
}// 具体产品:VIP订单
public class VipOrder implements Order {@Overridepublic void create() { System.out.println("创建 VIP 订单"); }
}// 工厂类:根据类型返回订单对象
public class OrderFactory {public Order createOrder(String type) {if ("vip".equals(type)) return new VipOrder();else return new NormalOrder();}
}// 使用
Order order = new OrderFactory().createOrder("vip");
order.create();
模式作用:
- 隐藏订单具体类的创建逻辑,调用方只需传递类型参数。
- 新增订单类型时(如团购订单),无需修改调用方代码。
二、单例模式:全局日志工具
概念
:资源独占
细节
:全局唯一
public class Logger {private static Logger instance;// 私有构造方法private Logger() {}// 双重非空检查 + 锁 保证线程安全public static Logger getInstance() {if (instance == null) {synchronized (Logger.class) {if (instance == null) {instance = new Logger();}}}return instance;}public void log(String message) {System.out.println("[LOG] " + message);}
}// 使用
Logger.getInstance().log("订单创建成功");
模式作用
:确保整个系统共享同一个日志实例,避免重复创建文件句柄或网络连接。
三、建造者模式:构建复杂订单对象
概念
:对象构建自由 与 必要顺序规则
public class OrderDetail {private String orderId; // 必要参数private String userId;private List<String> items;// 私有构造器,只能通过 Builder 创建private OrderDetail(Builder builder) {this.orderId = builder.orderId;this.userId = builder.userId;this.items = builder.items;}// 建造者内部类public static class Builder {private String orderId;private String userId;private List<String> items = new ArrayList<>();public Builder orderId(String orderId) {this.orderId = orderId; return this;} public Builder userId(String userId) { /* ... */ }public Builder addItem(String item) { /* ... */ }public OrderDetail build() {// 通过异常强制限制if (orderId == null) throw new IllegalArgumentException("orderId必填"); return new OrderDetail(this);}}
}// 使用
OrderDetail order = new OrderDetail.Builder().orderId("123") // 这下不得不填了 总结: 选填和必填的结合.userId("user1").addItem("手机").addItem("耳机").build();
模式作用
- 解决多参数构造的混乱(尤其是可选参数),强制必要参数填写。
- 链式调用更直观(对比含 5 个参数的构造方法)。
四、代理模式:支付前的权限校验
概念
:控制访问,代替直接访问
细节
:代理与被代理实现同一接口
// 抽象支付接口
public interface Payment {void pay(int amount);
}// 具体支付类
public class Alipay implements Payment {@Overridepublic void pay(int amount) {System.out.println("支付宝支付:" + amount + "元");}
}// 代理类:添加权限校验
public class PaymentProxy implements Payment {private Payment realPayment;public PaymentProxy(Payment realPayment) {this.realPayment = realPayment;}@Overridepublic void pay(int amount) {if (checkPermission()) {realPayment.pay(amount);} else {System.out.println("无权支付");}}private boolean checkPermission() {// 模拟权限检查return true;}
}// 使用
Payment payment = new PaymentProxy(new Alipay());
payment.pay(100);
模式作用
- 不修改
Alipay
源码的情况下,增加权限校验逻辑。 - 符合 开闭原则(对扩展开放,对修改关闭)。
五、观察者模式:吃瓜群众
概念
:具有实时报告的行为监控
细节
:双方在打架, 吃瓜人就是观察者, 当打出什么来了(状态变更), 就去报警;
:第二个例子就是订阅,当有什么活动了,就通知
// 主题接口
interface FightSubject {void addObserver(Onlooker o);void notifyObservers(String msg);
}// 具体打架事件
class Fight implements FightSubject {private List<Onlooker> people = new ArrayList<>();public void fightHappen(String result) {System.out.println("打架结果: " + result);notifyObservers(result);}@Overridepublic void addObserver(Onlooker o) { people.add(o); }@Overridepublic void notifyObservers(String msg) {people.forEach(o -> o.update(msg));}
}// 观察者
class Onlooker {public void update(String msg) {if (msg.contains("倒地")) {System.out.println("吃瓜群众: 报警!有人受伤");}}
}// 使用
Fight fight = new Fight();
fight.addObserver(new Onlooker());
fight.fightHappen("张三把李四打倒在地");
模式作用
- 解耦 打架模块 和 报警模块(支付成功后不需要直接调用库存、用户服务的方法)。
- 新增吃瓜群众时,无需修改打架代码。
六、适配器模式:兼容老插座
// 旧欧洲充电器(已有,圆头)
class EuropeanCharger {void roundPlug() { System.out.println("⚡欧洲圆头充电中"); }
}// 美国插座标准(目标接口,方头)
interface USSocket {void squarePlug();
}// 适配器:让欧洲充电器插入美国插座
class ChargerAdapter implements USSocket {private EuropeanCharger charger;public ChargerAdapter(EuropeanCharger charger) {this.charger = charger;}@Overridepublic void squarePlug() {System.out.print("[适配器转换圆头→方头] ");charger.roundPlug(); // 实际调用旧接口}
}// 使用
EuropeanCharger euroCharger = new EuropeanCharger();
USSocket adapter = new ChargerAdapter(euroCharger);
adapter.squarePlug(); // 输出: [适配器转换圆头→方头] ⚡欧洲圆头充电中
模式作用
:让旧插座无需修改即可接入新插座,解决兼容性问题。
七、装饰器模式:咖啡 与 加糖加奶
// 基础咖啡接口
interface Coffee {double cost();String desc();
}// 具体组件:黑咖啡
class BlackCoffee implements Coffee {public double cost() { return 10.0; }public String desc() { return "黑咖啡"; }
}// 装饰器抽象类
abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) {this.decoratedCoffee = coffee;}
}// 具体装饰器:加糖
class SugarDecorator extends CoffeeDecorator {public SugarDecorator(Coffee coffee) {super(coffee);}public double cost() {return decoratedCoffee.cost() + 2.0; // 加糖多2元}public String desc() {return decoratedCoffee.desc() + "+糖";}
}// 具体装饰器:加奶
class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) {super(coffee);}public double cost() {return decoratedCoffee.cost() + 5.0; // 加奶多5元}public String desc() {return decoratedCoffee.desc() + "+奶";}
}// 使用
Coffee coffee = new BlackCoffee();
coffee = new SugarDecorator(coffee); // 加糖
coffee = new MilkDecorator(coffee); // 再加奶System.out.println(coffee.desc() + ",价格:" + coffee.cost());
// 输出:黑咖啡+糖+奶,价格:17.0
模式作用
- 动态增加新功能,无需修改
黑咖啡
原始代码。
八、门面模式:一键影院模式
概念
:封装和协调统一访问的入口
// 子系统1:电灯
class Light {void on() { System.out.println("打开电灯"); }
}// 子系统2:空调
class AirConditioner {void set25℃() { System.out.println("空调设置25℃"); }
}// 子系统3:投影仪
class Projector {void down() { System.out.println("降下投影幕布"); }
}// 门面:一键启动家庭影院模式
class HomeTheaterFacade {private Light light = new Light();private AirConditioner ac = new AirConditioner();private Projector projector = new Projector();void movieMode() {light.on(); // 先开灯避免磕碰ac.set25℃(); // 设置舒适温度projector.down(); // 最后降幕布System.out.println("➤ 影院模式就绪");}
}// 使用
HomeTheaterFacade facade = new HomeTheaterFacade();
facade.movieMode();
// 输出:
// 打开电灯
// 空调设置25℃
// 降下投影幕布
// ➤ 影院模式就绪
模式作用
- 调用方只需和
HomeTheaterFacade
交互,无需了解 空调 投影仪 的细节。
九、策略模式:不如停路边
概念
:算法独立于客户端使用而变化
// 策略接口:停车计费规则
interface ParkingFeeStrategy {double calculateFee(int hours);
}// 具体策略1:商场普通计费(首小时5元,后续每小时3元)
class MallStrategy implements ParkingFeeStrategy {public double calculateFee(int hours) {return 5 + Math.max(0, hours - 1) * 3;}
}// 具体策略2:医院惠民计费(每天上限15元)
class HospitalStrategy implements ParkingFeeStrategy {public double calculateFee(int hours) {int days = hours / 24;int remainder = hours % 24;return days * 15 + Math.min(remainder * 2, 15); // 每小时2元}
}// 上下文:停车计费器
class ParkingFeeCalculator {private ParkingFeeStrategy strategy;// 初始化策略public ParkingFeeCalculator(ParkingFeeStrategy strategy) {this.strategy = strategy;}// 提供改变策略的 setter 方法public void setStrategy(ParkingFeeStrategy strategy) {this.strategy = strategy;}public void printFee(int hours) {System.out.println("停车" + hours + "小时,费用:" + strategy.calculateFee(hours) + "元");}
}// 使用
ParkingFeeCalculator calculator = new ParkingFeeCalculator(new MallStrategy());
calculator.printFee(5); // 输出:停车5小时,费用:17.0元calculator.setStrategy(new HospitalStrategy());
calculator.printFee(30); // 输出:停车30小时,费用:15 * 1 + 15=30元
模式作用
- 通过 算法类 ParkingFeeCalculator 指定具体实现策略,避免
if-else
硬编码
十、模板方法模式:定义订单处理流程
概念
:在父类定义必须算法骨架,允许子类重写特定步骤而不改变整体结构
// 抽象模板类
public abstract class OrderProcessor {// 模板方法(final防止子类覆盖流程)public final void processOrder() {validate();calculateTotal();saveToDatabase();notifyUser();}protected abstract void calculateTotal();protected void validate() {System.out.println("通用校验:订单ID非空");}protected void saveToDatabase() {System.out.println("保存订单到数据库");}protected void notifyUser() {System.out.println("发送短信通知用户");}
}// 具体实现:VIP订单处理
public class VipOrderProcessor extends OrderProcessor {@Overrideprotected void calculateTotal() {System.out.println("VIP订单计算:原价9折");}
}// 使用
OrderProcessor processor = new VipOrderProcessor();
processor.processOrder();
模式作用
- 固定订单处理流程(校验 → 计算 → 保存 → 通知),子类只实现差异部分(如计算逻辑)。
11. 责任链模式:审批流程
概念
:解耦请求发送者和接收者,使多个对象都有机会处理请求,形成链式处理(不等于链式编程)
// 抽象处理器:请假审批人
abstract class LeaveHandler {protected LeaveHandler next;void setNext(LeaveHandler next) { this.next = next; }abstract void handleRequest(int days);
}// 具体处理器:组长(处理≤3天)
class GroupLeader extends LeaveHandler {void handleRequest(int days) {if (days <= 3) {System.out.println("组长批准" + days + "天假");} else if (next != null) {next.handleRequest(days); // 转交上级}}
}// 具体处理器:经理(处理≤7天)
class Manager extends LeaveHandler {void handleRequest(int days) {if (days <= 7) {System.out.println("经理批准" + days + "天假");} else if (next != null) {next.handleRequest(days); // 转交上级}}
}// 具体处理器:总监(处理任何天数)
class Director extends LeaveHandler {void handleRequest(int days) {System.out.println("总监特批" + days + "天假");}
}// 使用
LeaveHandler leader = new GroupLeader();
LeaveHandler manager = new Manager();
LeaveHandler director = new Director();leader.setNext(manager); // 组长→经理
manager.setNext(director);// 经理→总监,(递进式处理)leader.handleRequest(2); // 组长批准2天假
leader.handleRequest(5); // 组长→经理批准5天假
leader.handleRequest(15); // 组长→经理→总监特批15天假
模式作用
- 解耦风控校验步骤,动态调整校验顺序或增删校验规则。
总结
一、分类 与 核心
1、创建型模式
模式 | 核心价值 | 典型场景 |
---|---|---|
工厂模式 | 隐藏对象创建细节,实现类型解耦 | 多类型订单创建 |
单例模式 | 全局资源统一访问,避免重复实例化 | 日志工具、配置管理器 |
建造者模式 | 分离复杂对象的构建与表示,强制必要参数 | 含多可选参数的订单对象构建 |
2、结构型模式
模式 | 核心价值 | 典型场景 |
---|---|---|
代理模式 | 控制访问扩展功能,符合开闭原则 | 支付权限校验、缓存代理 |
适配器模式 | 解决接口不兼容问题 | 新旧系统对接(插座转换案例) |
装饰器模式 | 动态添加功能,避免继承导致的类爆炸 | 咖啡加料、日志功能增强 |
门面模式 | 简化复杂子系统调用,提供统一入口 | 一键影院模式集成多个设备 |
3、行为型模式
模式 | 核心价值 | 典型场景 |
---|---|---|
观察者模式 | 解耦事件发布与订阅,实现松耦合通信 | 订单状态变更通知 |
策略模式 | 算法独立演化,支持运行时切换 | 多场景停车计费策略 |
责任链模式 | 动态组合处理流程,避免硬编码条件判断 | 多级审批/风控校验链 |
模板方法模式 | 固化流程框架,允许子类定制具体步骤 | 标准化订单处理流程 |
二、设计原则映射
1、SOLID原则实践
- 依赖倒置:高层模块通过抽象接口调用低层实现(如订单服务依赖库存接口而非具体DAO)
- 里氏替换:子类继承不破坏父类核心逻辑(如VIP订单处理器保持标准流程)
- 接口隔离:按功能拆分细粒度接口(如支付接口与回调接口分离)
- 合成复用:优先使用组合关系(装饰器模式优于多层继承)
2、其他原则
- 开闭原则:策略模式新增算法不修改原有代码
- 迪米特法则:订单服务通过中间层调用库存服务,避免直接操作DAO
- 高内聚低耦合:门面模式封装子系统交互,观察者模式解耦事件处理
三、模式选型指南
1、创建场景
- 简单对象创建 → 工厂模式
- 含复杂构造过程 → 建造者模式
- 全局唯一实例 → 单例模式
2、结构扩展
- 接口转换 → 适配器模式
- 功能动态叠加 → 装饰器模式
- 简化复杂调用 → 门面模式
- 访问控制 → 代理模式
3、行为管理
- 事件驱动 → 观察者模式
- 算法切换 → 策略模式
- 流程审批 → 责任链模式
- 标准化流程 → 模板方法模式
建议
- 识别:将易变部分抽象为策略/责任链,例
- 支付方式、校验规则
- 警惕过度:简单场景直接new对象,复杂场景再考虑引入设计模式
- 优先组合:装饰器模式替代多层继承,保持系统弹性
- 遵循最少知识:模块间通过接口通信(例订单服务调用库存Service而非直接操作DAO)
end…
如果这篇文章帮到你, 帮忙点个关注呗, 不想那那那点赞或收藏也行鸭 (。•̀ᴗ-)✧ ~
'(இ﹏இ`。)
相关文章:
概念实践极速入门 - 常用的设计模式 - 简单生活例子
概念实践极速入门 - 常用的设计模式 - 简单生活例子 SOLID 五大设计原则的首字母缩写 单一职责原则 和 开闭原则 就省略啦, 这两个概念很简单, 为了写而写反而容易误导人~* 鼓励大家字面理解! // 哎呀还是解释吧 单一(S): 单干一件事; 开闭(O): 拓展开放, 修改关…...
postgres 数据库信息解读 与 sqlshell常用指令介绍
数据库信息: sqlshell Server [localhost]: 192.168.30.101 Database [postgres]: Port [5432]: 5432 Username [postgres]: 用户 postgres 的口令: psql (15.12, 服务器 16.8 (Debian 16.8-1.pgdg1201)) 警告:psql 主版本15,服务器主版本为…...
映射网络路路径和ftp路径原理是什么,如何使用,有什么区别
文章目录 一、原理1. 映射网络路径2. FTP路径 二、使用方法1. 映射网络路径2. FTP路径 三、主要区别1. 协议与功能2. 安全性与权限3. 适用场景 四、如何选择?五、注意事项 映射网络路径(如SMB/CIFS或NFS)和FTP路径(FTP/FTPS/SFTP&…...
微服务3--服务容错
前言:本篇主要介绍服务容错与Sentinel进行限流。 高并发带来的问题 在微服务架构中,我们将业务拆分为一个个的服务,服务与服务之间都可以相互调用,但是由于网络或者说服务器本身的问题,服务不能保证100%可用ÿ…...
4.15redis点评项目下
--->接redis点评项目上 Redis优化秒杀方案 下单流程为:用户请求nginx--->访问tomcat--->查询优惠券--->判断秒杀库存是否足够--->查询订单--->校验是否是一人一单--->扣减库存--->创建订单 以上流程如果要串行执行耗时会很多,…...
Web开发-JavaEE应用原生和FastJson反序列化URLDNS链JDBC链Gadget手搓
知识点: 1、安全开发-JavaEE-原生序列化-URLDNS链分析 2、安全开发-JavaEE-FastJson-JdbcRowSetImpl链分析 利用链也叫"gadget chains",我们通常称为gadget: 1、共同条件:实现Serializable或者Externalizable接口&…...
坚持每日Codeforces三题挑战:Day 3 - 题目详解(2024-04-16,难度:900, 1200, 1200)
每天坚持写三道题第三天 (今天写点简单的,剩下去刷力扣了) 今日题目: Problem - B - Codeforces 900 Problem - B - Codeforces 1300 Problem - D - Codeforces 1400 题目一: Problem - B - Codeforces 题目大意: 给你一个数组,每次操…...
MySQL5.7递归查询
向下递归查询 SELECT ID,NAME,PARENT_ID,LEVEL_FROM(SELECT ID AS _IDS,(SELECT ID : GROUP_CONCAT(ID)FROM TREE_TABLE WHERE FIND_IN_SET(PARENT_ID,ID) > 0AND REMOVE N) T1,L : L 1 AS LEVEL_FROM TREE_TABLE,(SELECT ID : start, L: 0) T2WHERE ID IS NOT NULL) T3,…...
半导体设备通信标准—secsgem v0.3.0版本使用说明文档(2)之GEM(SEMI 30)
文章目录 1、处理器1.1、事件 2、GEM 合规性2.1、状态模型2.2、 设备加工状态2.3、 文档2.4、 控制 (作员启动)2.5、 动态事件报告配置2.6、 跟踪数据收集2.7、 报警管理2.8、 远程控制2.9、 设备常量2.10、 工艺配方管理2.11、 物料移动2.12、 设备终端…...
C++异步编程从入门到精通实战:全面指南与实战案例
C异步编程从入门到精通实战:全面指南与实战案例 在当今多核处理器普及的时代,异步编程成为了提升程序性能和响应能力的关键技术。无论是在高频交易系统、实时游戏引擎,还是网络服务器和大型数据处理平台,异步编程都发挥着至关重要…...
驱动开发硬核特训 · Day 13:从 device_create 到 sysfs,设备文件是如何生成的?
🔍 B站相应的视屏教程: 📌 内核:博文视频 - 备树深度解析:理论 实践全指南(含 of 函数与 i.MX8MP 实例) 敬请关注,记得标为原始粉丝。 🔧 📌 本文目标&#…...
肾脏系统触发 “数据包泄漏“ (血尿)与 “元数据校验异常“(蛋白尿)
肾脏系统触发 "数据包泄漏" (血尿)与 "元数据校验异常"(蛋白尿) 用计算机术语来类比。在之前的对话中,肾小球被比作防火墙或过滤器,肾小管则是回收系统。红细胞泄漏通常是因为肾小球的过滤屏障受损,而蛋白尿则可能与肾小…...
密码学(二)流密码
2.1流密码的基本概念 流密码的基本思想是利用密钥 k 产生一个密钥流...,并使用如下规则对明文串 ... 加密:。密钥流由密钥流发生器产生: ,这里是加密器中的记忆元件(存储器)在时刻 i 的状态,…...
Python 趣味学习 -数据类型脱口秀速记公式 [特殊字符]
🎤 Python数据类型脱口秀速记公式 🐍 1️⃣ 四大金刚登场 "Set叔(无序洁癖)、Tuple爷(顽固老头)、List姐(百变女王)、Dict哥(万能钥匙)"2️⃣ 特性对比RAP 🎶 内存/作用域: 全局变量 → 函数内修改 → 可变(mutable)会…...
嵌入式Linux设备使用Go语言快速构建Web服务,实现设备参数配置管理方案探究
本文探讨,利用Go语言及gin框架在嵌入式Linux设备上高效搭建Web服务器,以实现设备参数的网页配置。通过gin框架,我们可以在几分钟内创建一个功能完善的管理界面,方便对诸如集中器,集线器等没有界面的嵌入式设备的管理。…...
波束形成(BF)从算法仿真到工程源码实现-第十二节-总结
一、总结 (1)基于webrtc的非线性波束形成效果较好,复杂度较低,但是波束形成后引入了非线性,导致噪声估计不准确,降噪效果变差。 (2)MVDR使用噪声协方差矩阵对平稳噪声降噪效果比较…...
【AI】IDEA 集成 AI 工具的背景与意义
一、IDEA 集成 AI 工具的背景与意义 随着人工智能技术的迅猛发展,尤其是大语言模型的不断演进,软件开发行业也迎来了智能化变革的浪潮。对于开发者而言,日常工作中面临着诸多挑战,如代码编写的重复性劳动、复杂逻辑的实现、代码质…...
解释原型链的概念,并说明`Object.prototype.__proto__`的值是什么?
原型链是 JavaScript 中实现继承的核心机制。每个对象都有一个指向其原型对象的私有链接(通过 [[Prototype]] 内部属性),而原型对象自身也可能拥有原型,这种链式结构被称为原型链。当访问对象的属性时,若对象自身不存在…...
prototype`和`__proto__`有什么区别?如何手动修改一个对象的原型?
在 JavaScript 中,prototype 和 __proto__ 都与原型链相关,但它们的角色和用途有本质区别: 1. prototype 和 __proto__ 的区别 特性prototype__proto__归属对象仅函数对象拥有(如构造函数)所有对象默认拥有࿰…...
数据挖掘案例-电力负荷预测
今日课程 时间序列预测介绍 电力负荷预测项目开发(开发一个基于时间以及历史负荷信息,预测未来负荷的模型) 一、时间序列预测简介 1.什么是时序预测 时间序列预测是一种根据历史时间序列数据来预测未来值的方法。 任务比较好理解&#…...
SQL Server中OPENJSON + WITH 来解析JSON
一、概念 OPENJSON 是 SQL Server(2016 及更高版本) 中引入的一个表值函数,它将 JSON 文本转换为行和列的关系型数据结构。通过添加 WITH 子句,可以明确指定返回数据的结构和类型,实现 JSON 数据到表格数据的精确映射…...
在 Linux 中判断当前网络类型与网卡类型的实用方法(内外网判断 + 网卡分类)
在日常使用 Linux(例如 Jetson、树莓派、服务器)过程中,我们经常会遇到以下几个问题: 如何知道系统当前是走 有线网络还是无线网络?如何判断是连接了 公网还是内网?169.254.x.x 是什么?为什么我…...
Docker compose入门
目录 Docker Compose简介安装docker compose局限一 适合单机部署,不适合生产环境1. 架构设计目标不同2. 关键功能对比3. 生产环境的核心需求4. 适用场景总结5. 为什么 Compose 不适合生产? Docker Compose 简介 Docker Compose 是一个用于简化多容器Do…...
Docker Search 和 Docker Pull 失效解决
目录 1. Docker Search 1.1 问题描述 1.2 解决方案 1.2.1 方案1 命令行方式 1.2.2 方案2 非命令行方式 2. Docker Pull 2.1 问题描述 2.2 解决方案 2.2.1 替换镜像源 2.2.1.1 编辑镜像源(linux)版 2.2.1.2 编辑镜像源(windows版本…...
Langchain Agent封装的工具
LangChain Agent Tools 参考文档 本文档详细介绍了LangChain框架中可用的Agent工具及其使用方法。这些工具可以赋予AI智能体与外部系统和服务交互的能力,从而构建功能更强大的应用程序。 目录 工具加载方法基础工具文件和系统工具搜索和信息检索工具语言模型增强…...
Windows11删除文件时弹出提示“没有管理员权限”,怎么办?
Windows11删除文件时弹出提示“没有管理员权限”,怎么办? 原因:文件没有读取到完全控制的权限。 解决方法:点击开始-设置-账户,检查Windows是否登录管理员账户,必须登录管理员账户。然后回到电脑桌面&…...
使用HTML + CSS + JS,编写一个台球追分计分器
目录 一.代码 二.效果展示 三.该计分器的优点 一.代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
CS5346 - CHARTS: Chart with Point / Bar / Line / Box
文章目录 Chart with Point(点图)Scatter Chart(散点图)Pictogram(图标)Connected Scatter PlotConnected Dot plot(连接点图)Bubble Chart(气泡图) Chart wi…...
CNN实现简易教程
一、CNN基础回顾与设计原则 在开始实践之前,我们先快速回顾CNN的核心组件和设计原则,这将帮助你理解后续的代码和设计决策。 1. CNN的核心组件 卷积层(Convolutional Layer):通过卷积核提取局部特征(如边缘、纹理)。主要参数包括: 输入通道数(in_channels):输入数…...
Flask(1): 在windows系统上部署项目1
1 前言 学习python也有段时间了,最近一个小项目要部署,正好把过程写下来。 在程序的结构上我选择了w/s模式,相比于c/s模式,无需考虑客户端的升级;框架我选择了flask,就是冲着轻量级去的,就是插件…...
Zookeeper 可观测性最佳实践
Zookeeper 介绍 ZooKeeper 是一个开源的分布式协调服务,用于管理和协调分布式系统中的节点。它提供了一种高效、可靠的方式来解决分布式系统中的常见问题,如数据同步、配置管理、命名服务和集群管理等。本文介绍通过 DataKit 采集 Zookeeper 指标&#…...
vs2022使用git方法
1、创建git 2、在cmd下执行 git push -f origin master ,会把本地代码全部推送到远程,同时会覆盖远程代码。 3、需要设置【Git全局设置】,修改的代码才会显示可以提交,否则是灰色的不能提交。 4、创建的分支,只要点击…...
【探商宝】跨境关税博弈下的技术破局:从头部平台现象看数字贸易体系重构
2025年4月,某头部跨境电商平台在北美市场上演了一场教科书级的技术突围战:其移动应用在72小时内从应用商店总榜300名开外飙升至第2位,单日下载量暴增近10倍。这场现象级爆发的背后,是关税政策与数字技术深度博弈的集中呈现。作为开…...
DeepSeek是否支持动态模态选择?揭秘多模态AI的智能切换能力
什么是动态模态选择? 想象一下你在和AI助手聊天: “帮我看看这张图片里有什么?”——AI切到视觉模式 “把图片内容写成300字总结”——切回文本模式 “再把它翻译成英文语音”——切到语音模式 这种根据任务需求自动切换处理模式的能力就是…...
Qwen2.5-Omni 部署框架选择指南:PyTorch vs. TensorFlow 深度对比
目录 一、核心结论:优先选择 PyTorch 方案 二、框架技术对比 1. 官方支持度 2. 性能基准测试(RTX 4090) 3. 关键功能支持 三、环境配置详解 1. PyTorch 推荐方案 系统配置 关键依赖 验证CUDA可用性 2. TensorFlow 替代方案&#x…...
全栈工程师角色介绍
全栈工程师(Full Stack Engineer)是一种综合型技术角色,具备从前端到后端、数据库、服务器运维等多领域的开发能力,并能独立完成产品全生命周期的构建与维护。其核心定义可从以下维度展开: 一、核心定义 技术广度与深…...
从零起步的Kaggle竞赛 - BirdCLEF2025
一个优秀的coder,先从CV工程开始...... 首先复制了 LB 0.804- EfficientNet B0 Pytorch Pipeline | Kaggle 这个notebook并尝试提交,ok,0.804 下载了大佬的代码试图在本地修改模型结构并训练。 以下是大佬的notebook中的代码,可…...
基于CNN+ViT的蔬果图像分类实验
本文只是做一个简单融合的实验,没有任何新颖,大家看看就行了。 1.数据集 本文所采用的数据集为Fruit-360 果蔬图像数据集,该数据集由 Horea Mureșan 等人整理并发布于 GitHub(项目地址:Horea94/Fruit-Images-Datase…...
MySQL SQL 执行顺序(理论顺序)
示例 SQL: SELECT name, COUNT(*) FROM users WHERE age > 18 GROUP BY name HAVING COUNT(*) > 1 ORDER BY name ASC LIMIT 10;虽然语句是从 SELECT 写起的,但执行顺序其实是这样的: 执行顺序SQL 子句作用说明①FROM确定查询的…...
用Allan Deviation的方式估计长时间频率偏差
在电路设计中,若需要评估OSC长时间的偏差(秒级别),观测的时间越多,低频噪声1/f上载的越厉害,如何通过PhaseNoise去有效估计长时间的偏差呢?...
无人机避障与目标识别技术分析!
一、无人机避障技术 1. 技术实现方式 传感器融合: 视觉传感(RGB/双目/红外相机):基于SLAM(同步定位与地图构建)实现环境建模,但依赖光照条件。 激光雷达(LiDAR)&…...
2025年渗透测试面试题总结-拷打题库01(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库01 1. PHP爆绝对路径方法? 2. 渗透工具及最常用工具 3…...
大厂面试:六大排序
前言 本篇博客集中了冒泡,选择,二分插入,快排,归并,堆排,六大排序算法 如果觉得对你有帮助,可以点点关注,点点赞,谢谢你! 1.冒泡排序 //冒泡排序ÿ…...
Python爬虫第15节-2025今日头条街拍美图抓取实战
目录 一、项目背景与概述 二、环境准备与工具配置 2.1 开发环境要求 2.2 辅助工具配置 三、详细抓取流程解析 3.1 页面加载机制分析 3.2 关键请求识别技巧 3.3 参数规律深度分析 四、爬虫代码实现 五、实现关键 六、法律与道德规范 一、项目概述 在当今互联网时代&a…...
std::map gdb调试ok ,直接运行会crash
在使用 std::map 并且在调试模式下没有问题,但在直接运行时出现崩溃(crash)的情况,通常是由于以下几个原因引起的: 未初始化的变量使用:在调试模式下,某些变量可能因为调试工具(如 G…...
【2025年泰迪杯数据挖掘挑战赛】A题 数据分析+问题建模与求解+Python代码直接分享
目录 2025年泰迪杯数据挖掘挑战赛A题完整论文:建模与求解Python代码1问题一的思路与求解1.1 问题一的思路1.1.1对统计数据进行必要说明:1.1.2统计流程:1.1.3特殊情况的考虑: 1.2 问题一的求解1.2.1代码实现1.2.2 问题一结果代码分…...
git在分支上会退到某个指定的commit
1、在idea上先备份好分支(基于现有分支new branch) 2、在gitlab管理端删除现有分支 3、在idea中大卡terminal,执行 git log 查看commit log ,找到要会退到的commit唯一码,然后执行git reset 唯一码 4、查看本地代码状态 git st…...
Cursor入门教程-JetBrains过度向
Cursor使用笔记 **前置:**之前博主使用的是JetBrains的IDE,VSCode使用比较少,所以会尽量朝着JetBrains的使用习惯及样式去调整。 一、设置语言为中文 如果刚上手Cursor,那么肯定对Cursor中的众多选项配置项不熟悉,这…...
MySQL之text字段详细分类说明
在 MySQL 中,TEXT 是用来存储大量文本数据的数据类型。TEXT 类型可以存储非常长的字符串,比 VARCHAR 类型更适合存储大块的文本数据。TEXT 数据类型分为以下几个子类型,每个子类型用于存储不同大小范围的文本数据: TINYTEXT: 可以…...
为什么 Transformer 要使用多头注意力机制?
简而言之,多头注意力机制可以让模型从不同的在空间中并行地捕捉到不同的特征关系,从而更全面,更灵活地理解序列中的信息。 举个例子,如果要看一幅画,就不能简单地只关注例如颜色,还要关注到结构࿰…...