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

Java设计模式:四、行为型模式-09:模板模式

文章目录

  • 一、定义:模板模式
  • 二、模拟场景:模板模式
  • 三、改善代码:模板模式
    • 3.0 引入依赖
    • 3.1 工程结构
    • 3.2 模板模式结构图
    • 3.3 爬取商品生成海报实现
      • 3.3.1 HTTP获取连接类
      • 3.3.2 定义执行顺序的抽象类
      • 3.3.3 当当爬取抽象实现类
      • 3.3.4 京东爬取抽象实现类
      • 3.3.5 淘宝爬取抽象实现类
    • 3.4 单元测试
  • 四、总结:模板模式

一、定义:模板模式

请添加图片描述

  • 模板模式:通过在抽象类中定义抽象方法的执行顺序,并将抽象方法设定为只有子类实现,但不涉及 独立访问 的方法。

二、模拟场景:模板模式

请添加图片描述

  • 模拟爬虫各类电商商品,生成营销推广海报场景。
  • 模板模式的核心点在于:
    • 由抽象类定义抽象方法执行策略,也就是说父类规定好了 一系列的执行标准,这些标准串联成一整套业务流程。
  • 在这个场景中模拟爬虫爬取各类商家的商品信息,生成推广海报,赚取商品返利。
  • 整个爬取过程分为三个步骤:模拟登录、爬取信息、生成海报。
    • 因为有些商品只有登录后才可以爬取,并且登录可以看到一些特定的价格,这与未登录用户看到的价格不同。
    • 不同的电商网站爬取方式不同,解析方式也不同,因此可以作为每一个实现类中的特定实现。
    • 生成海报的步骤基本一样,但会有特定的商品来源标识。所以这三个步骤可以使用模板模式来设定,并有具体的场景做子类实现。

三、改善代码:模板模式

💡 模板模式的业务场景可能在世的开发中并不是很多,主要因为这个设计模式会在抽象类中定义逻辑行为的执行顺序。
一般情况下,我们用的抽象类定义的逻辑行为都比较轻量级或者没有,只有提供一些基本方法公共调用和实现。

  • 但如果遇到适合的场景使用这样的设计模式也是非常方便的,因为他可以控制整套逻辑的执行顺序和统一的输入、输出,而对于实现方只需要关心好自己的业务逻辑即可。
  • 在模拟场景中,只需要记住三步实现:模拟登录爬取信息生成海报

3.0 引入依赖

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><!-- LOGGING begin --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.5</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.5</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.9</version><exclusions><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency>
</dependencies>

3.1 工程结构

design-step-22
|——src|——main|--java|--com.lino.design|--impl|		|--DangDangNetMall.java|		|--JDNetMall.java|		|--TaoBaoNetMall.java|-HttpClient.java|-NetMall.java|--test|--com.lino.design.test|-ApiTest.java

3.2 模板模式结构图

请添加图片描述

  • 一个定义了抽象方法执行顺序的核心抽象类,以及三个模拟具体的实现(京东淘宝当当)的电商服务。

3.3 爬取商品生成海报实现

3.3.1 HTTP获取连接类

HttpClient.java

package com.lino.design;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;/*** @description: http请求类*/
public class HttpClient {public static String doGet(String httpUrl) {HttpURLConnection connection = null;InputStream is = null;BufferedReader br = null;String result = null;try {// 创建远程url连接对象URL url = new URL(httpUrl);// 通过远程url连接对象打开一个连接,强转成HttpURLConnectionconnection = (HttpURLConnection) url.openConnection();// 设置连接方式:getconnection.setRequestMethod("GET");// 设置连接主机服务器的超时时间:15000毫秒connection.setConnectTimeout(15000);// 设置读取远程返回的数据时间:60000毫秒connection.setReadTimeout(60000);// 发送请求connection.connect();// 通过connection连接,获取输入流if (connection.getResponseCode() == 200) {is = connection.getInputStream();// 封装输入流is,并指定字符集br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));// 存放数据StringBuilder sbf = new StringBuilder();String temp = null;while ((temp = br.readLine()) != null) {sbf.append(temp);sbf.append("\r\n");}result = sbf.toString();}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 关闭资源if (null != br) {try {br.close();} catch (IOException e) {e.printStackTrace();}}if (null != is) {try {is.close();} catch (IOException e) {e.printStackTrace();}}// 关闭远程连接assert connection != null;connection.disconnect();}return result;}
}

3.3.2 定义执行顺序的抽象类

NetMall.java

package com.lino.design;import com.sun.org.apache.xpath.internal.operations.Bool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.regex.Pattern;/*** @description: 抽象模板*/
public abstract class NetMall {protected Logger logger = LoggerFactory.getLogger(NetMall.class);protected final Pattern p9 = Pattern.compile("(?<=title\\>).*(?=</title)");/*** 用户ID*/String uId;/*** 用户密码*/String uPwd;public NetMall(String uId, String uPwd) {this.uId = uId;this.uPwd = uPwd;}/*** 生成商品推广海报** @param skuUrl 商品url地址* @return 推广海报*/public String generateGoodsPoster(String skuUrl) {// 1.验证登录if (!login(uId, uPwd)) {return null;}// 2.爬虫商品Map<String, String> reptile = reptile(skuUrl);// 3.组装海报return createBase64(reptile);}/*** 模拟登录** @param uId  用户ID* @param uPwd 用户密码* @return 登录结果*/protected abstract Boolean login(String uId, String uPwd);/*** 爬虫提取商品信息(登录后的优惠价格)** @param skuUrl 商品Url地址* @return 商品信息*/protected abstract Map<String, String> reptile(String skuUrl);/*** 生成商品推广海报** @param goodsInfo 商品信息* @return 推广海报*/protected abstract String createBase64(Map<String, String> goodsInfo);
}
  • 这个类是模板模式的灵魂。
  • 定义可外被外部访问的方法 generateGoodsPoster ,用于生成商品推广海报。
  • generateGoodsPoster 在方法中定义抽象方法的执行顺序 1、2、3 步。
  • 提供三个具体的抽象方法,让外部继承实现。
    • login:模拟登录。
    • reptile:爬虫提取商品信息(登录后的优惠价格)。
    • createBase64:生成商品推广海报。

3.3.3 当当爬取抽象实现类

DangDangNetMall.java

package com.lino.design.impl;import com.alibaba.fastjson.JSON;
import com.lino.design.HttpClient;
import com.lino.design.NetMall;
import sun.misc.BASE64Encoder;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @description: 当当抽象实现类*/
public class DangDangNetMall extends NetMall {public DangDangNetMall(String uId, String uPwd) {super(uId, uPwd);}@Overrideprotected Boolean login(String uId, String uPwd) {logger.info("模拟当当用户登录 uId:{} uPwd:{}", uId, uPwd);return true;}@Overrideprotected Map<String, String> reptile(String skuUrl) {String str = HttpClient.doGet(skuUrl);Matcher m9 = p9.matcher(str);Map<String, String> map = new ConcurrentHashMap<>();if (m9.find()) {map.put("name", m9.group());}map.put("price", "4548.00");logger.info("模拟当当商品爬虫解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);return map;}@Overrideprotected String createBase64(Map<String, String> goodsInfo) {BASE64Encoder encoder = new BASE64Encoder();logger.info("模拟生成当当商品base64海报");return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());}
}

3.3.4 京东爬取抽象实现类

JDNetMall.java

package com.lino.design.impl;import com.alibaba.fastjson.JSON;
import com.lino.design.HttpClient;
import com.lino.design.NetMall;
import sun.misc.BASE64Encoder;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @description: 京东抽象实现类*/
public class JDNetMall extends NetMall {public JDNetMall(String uId, String uPwd) {super(uId, uPwd);}@Overrideprotected Boolean login(String uId, String uPwd) {logger.info("模拟京东用户登录 uId:{} uPwd:{}", uId, uPwd);return true;}@Overrideprotected Map<String, String> reptile(String skuUrl) {String str = HttpClient.doGet(skuUrl);Matcher m9 = p9.matcher(str);Map<String, String> map = new ConcurrentHashMap<>();if (m9.find()) {map.put("name", m9.group());}map.put("price", "5999.00");logger.info("模拟京东商品爬虫解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);return map;}@Overrideprotected String createBase64(Map<String, String> goodsInfo) {BASE64Encoder encoder = new BASE64Encoder();logger.info("模拟生成京东商品base64海报");return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());}
}

3.3.5 淘宝爬取抽象实现类

TaoBaoNetMall.java

package com.lino.design.impl;import com.alibaba.fastjson.JSON;
import com.lino.design.HttpClient;
import com.lino.design.NetMall;
import sun.misc.BASE64Encoder;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;/*** @description: 淘宝抽象实现类*/
public class TaoBaoNetMall extends NetMall {public TaoBaoNetMall(String uId, String uPwd) {super(uId, uPwd);}@Overrideprotected Boolean login(String uId, String uPwd) {logger.info("模拟淘宝用户登录 uId:{} uPwd:{}", uId, uPwd);return true;}@Overrideprotected Map<String, String> reptile(String skuUrl) {String str = HttpClient.doGet(skuUrl);Matcher m9 = p9.matcher(str);Map<String, String> map = new ConcurrentHashMap<>();if (m9.find()) {map.put("name", m9.group());}map.put("price", "4799.00");logger.info("模拟淘宝商品爬虫解析:{} | {} 元 {}", map.get("name"), map.get("price"), skuUrl);return map;}@Overrideprotected String createBase64(Map<String, String> goodsInfo) {BASE64Encoder encoder = new BASE64Encoder();logger.info("模拟生成淘宝商品base64海报");return encoder.encode(JSON.toJSONString(goodsInfo).getBytes());}
}

💡 模拟登录、爬取信息、生成海报由三个实现类分别实现。

3.4 单元测试

ApiTest.java

package com.lino.design.test;import com.lino.design.NetMall;
import com.lino.design.impl.JDNetMall;
import jdk.nashorn.internal.scripts.JD;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @description: 单元测试*/
public class ApiTest {private Logger logger = LoggerFactory.getLogger(ApiTest.class);private String JD_URL = "https://item.jd.com/100008348542.html";private String TAO_BAO_URL = "https://detail.tmall.com/item.htm";private String DANG_DANG_URL = "http://product.dangdang.com/1509704171.html";@Testpublic void test_NetMall() {NetMall netMall = new JDNetMall("100001", "******");String base64 = netMall.generateGoodsPoster(JD_URL);logger.info("测试结果:{}", base64);}
}
  • 测试类提供了三个商品连接,也可以是其他商品的连接。
  • 爬取的成功模拟爬取京东商品,可以替换为其他商品服务。new JDNetMallnew DangDangNetMallnew TaoBaoNetMall

测试结果

10:36:08.491 [main] INFO  com.lino.design.NetMall - 模拟京东用户登录 uId:100001 uPwd:******
10:36:09.582 [main] INFO  com.lino.design.NetMall - 模拟京东商品爬虫解析:【AppleiPhone 11Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待【行情 报价 价格 评测】-京东 | 5999.00 元 https://item.jd.com/100008348542.html
10:36:09.582 [main] INFO  com.lino.design.NetMall - 模拟生成京东商品base64海报
10:36:09.615 [main] INFO  com.lino.design.test.ApiTest - 测试结果:eyJwcmljZSI6IjU5OTkuMDAiLCJuYW1lIjoi44CQQXBwbGVpUGhvbmUgMTHjgJFBcHBsZSBpUGhv
bmUgMTEgKEEyMjIzKSAxMjhHQiDpu5HoibIg56e75Yqo6IGU6YCa55S15L+hNEfmiYvmnLog5Y+M
5Y2h5Y+M5b6F44CQ6KGM5oOFIOaKpeS7tyDku7fmoLwg6K+E5rWL44CRLeS6rOS4nCJ9

四、总结:模板模式

  • 通过上面的实现可以看到 模板模式 在定义统一结构也就是执行标准上非常方便。
    • 也就很好的控制了后续的实现这不用关心调用逻辑,按照统一方式执行。那么类的继承者只需要关心具体的业务逻辑实现即可。
  • 模板模式也是对了解决子类通用方法,放到父类中设计的优化。让每一个子类只做子类需要完成的内容,而不需要关心其他逻辑。
    • 这样提取公共代码,行为由父类管理,扩展可变部分,也就非常有利于开发拓展和迭代。

相关文章:

Java设计模式:四、行为型模式-09:模板模式

文章目录 一、定义&#xff1a;模板模式二、模拟场景&#xff1a;模板模式三、改善代码&#xff1a;模板模式3.0 引入依赖3.1 工程结构3.2 模板模式结构图3.3 爬取商品生成海报实现3.3.1 HTTP获取连接类3.3.2 定义执行顺序的抽象类3.3.3 当当爬取抽象实现类3.3.4 京东爬取抽象实…...

【前端】Vue2 脚手架模块化开发 -快速入门

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理Vue2 脚手架模块化开发 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&#x…...

【广州华锐互动】AR昆虫认知学习系统实现对昆虫形态的捕捉和还原

随着科技的不断发展&#xff0c;人们对自然界的认识也在不断加深。在这个过程中&#xff0c;AR&#xff08;增强现实&#xff09;技术的出现为人们带来了全新的体验方式。为此&#xff0c;广州华锐互动开发了AR昆虫认知学习系统&#xff0c;本文将为大家详细介绍这款系统的特点…...

nginx压缩ttf文件 mine.types的作用

最近在运维过程中&#xff0c;前端提到发现在linux上下载某ttl文件&#xff08;字体文件&#xff09;太大&#xff0c;传输过程比较慢&#xff0c;于是就想着使用nginx的gzip进行压缩&#xff0c;经过不断尝试&#xff0c;终于发现在nginx的配置目录/etc/nginx/mine.types 文件…...

【云原生】Kubernetes容器编排工具

目录 1. K8S介绍 1.1 k8s的由来 下载地址 1.2 docker编排与k8s编排相比 1.3 传统后端部署与k8s 的对比 传统部署 k8s部署 ​2. k8s的集群架构与组件 &#xff08;1&#xff09; Kube-apiserver &#xff08;2&#xff09;Kube-controller-manager &#xff08;3&a…...

【Css】Less和Sass的区别:

文章目录 一、定义&#xff1a;【1】Less【2】Sass 二、相同之处:三、区别:【1】实现方式&#xff1a;【2】实现方式&#xff1a;【3】混合(Mixins)&#xff1a;【4】解析方式&#xff1a;【5】变量的作用域&#xff1a;【6】比起Less 一、定义&#xff1a; 【1】Less Less 是…...

八、MySQL(DML)如何修改表中的数据?

1、修改表数据 &#xff08;1&#xff09;基础语法&#xff1a; update 表名 SET 字段名1数值1,字段名2数值2&#xff0c;…… [where 条件]; &#xff08;2&#xff09; 操作实例&#xff1a; 第一步&#xff1a; 先准备一张表 insert into things values (10086,18,0x12…...

Python使用 YOLO_NAS_S 模型进行目标检测并保存预测到的主体图片

一、前言&#xff1a; 使用 YOLO_NAS_S 模型进行目标检测&#xff0c;并保存预测到的主体图片 安装包&#xff1a; pip install super_gradients pip install omegaconf pip install hydra-core pip install boto3 pip install stringcase pip install typing-extensions pi…...

<AIX>《AIX RAID 操作之LV逻辑卷镜像制作,即lvcopy操作》

《AIX RAID 操作之LV逻辑卷镜像制作&#xff0c;即lvcopy操作》 1 RAID技术2 AIX逻辑卷组做镜像3 环境3.1 操做系统版本3.2 检查rootvg的lv3.3 检查rootvg的磁盘信息4 创建测试的test的lv逻辑卷4.1 测试1&#xff1a;直接创建镜像lv4.2 测试2&#xff1a;创建未开启镜像的lv 5 …...

JSX底层渲染机制

JSX底层渲染机制 一,.步骤 1.把我们写的jsx语法编译为虚拟DOM【virtualDOM】 虚拟DOM对象&#xff1a;框架自己内部构建的一套对象体系&#xff08;对象的相关成员都是React内部绑定的&#xff09;&#xff0c;基于这些属性描述出我们所构建视图中的DOM接的相关特征 1基于ba…...

2023_Spark_实验六:Scala面向对象部分演示(二)(IDEA开发)

7、Scala中的apply方法&#xff08;&#xff09; 遇到如下形式的表达式时&#xff0c;apply方法就会被调用&#xff1a; Object(参数1,参数2,......,参数N) 通常&#xff0c;这样一个apply方法返回的是伴生类的对象&#xff1b;其作用是为了省略new关键字 Object的apply方法…...

ArcGIS美化科研论文地图(利用在线底图)

1.加载在线底图服务 在ArcGIS Desktop中打开Catalog窗口&#xff0c;在GIS Servers中点击Add ArcGIS Server&#xff0c;之后选项全部默认&#xff0c;仅在URL中输入以下网址https://services.arcgisonline.com/arcgis 之后就可以看到底图了 我们在WorldElevation3D中选择Nat…...

vue项目静态文件资源下载

业务场景&#xff1a;页面有一个导入功能&#xff0c;需要一个模板文件供下载&#xff0c;文件放在本地。 对于 Vue 3 Vite 项目&#xff0c;使用 require 方法来导入模块是不被支持的。require 是 CommonJS 规范中用于模块导入的方法&#xff0c;在 Webpack 等构建工具中常用…...

Apache Hudi初探(三)(与flink的结合)--flink写hudi的操作(真正的写数据)

背景 在之前的文章中Apache Hudi初探(二)(与flink的结合)–flink写hudi的操作(JobManager端的提交操作) 有说到写hudi数据会涉及到写hudi真实数据以及写hudi元数据,这篇文章来说一下具体的实现 写hudi真实数据 这里的操作就是在HoodieFlinkWriteClient.upsert方法: public …...

解释 Git 的基本概念和使用方式(InsCode AI 创作助手)

Git 是一种分布式版本控制系统&#xff0c;它允许多个用户协同工作并对项目进行版本控制。下面是 Git 的基本概念和使用方式&#xff1a; 基本概念&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;存储代码和版本历史记录的地方。 提交&#xff08;Commit&a…...

【QT】信号和槽(15)

前面的内容说了很多不同的控件如何使用&#xff0c;今天来看下QT的核心&#xff0c;信号与槽&#xff08;Signals and slots&#xff09;&#xff01; 简单理解一下&#xff0c;就是我们的信号与槽连接上了之后&#xff0c;发射一个信号给到槽&#xff0c;槽函数接收到了这个信…...

EFLK日志平台(filebeat-->kafka-->logstash-->es-->kiabana)

ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 安装顺序 1.安装es 7.17.12 2.安装kibana 7.17.12 3.安装x-pack 保证以上调试成功后开始下面…...

C盘扩容遇到的问题(BitLocker解密、)

120G的C盘不知不觉的就满了&#xff0c;忍了好久终于要动手了。 尽管电脑-管理--磁盘管理里可以进行磁盘大小调整&#xff0c;但由于各盘都在用&#xff0c;不能够连续调整&#xff0c;所以选用DiskGenius。 # DiskGenius调整分区大小遇到“您选择的分区不支持无损调整容量” …...

ShardingSphere——柔性事务SEATA原理

摘要 Apache ShardingSphere集成了 SEATA 作为柔性事务的使用方案&#xff0c;本文主要介绍其实现ShardingSphere中柔性事务SEATA原理原理。帮助你更好的理解ShardingSphere原理。同时帮助大家更好的使用柔性事务SEATA原理。 一、Seata柔性事务 Apache ShardingSphere 集成了…...

Introducing GlobalPlatform(一篇了解GP)

安全之安全(security)博客目录导读 TEE之GP(Global Platform)认证汇总 目录 一、GP简介 二、GP新的重点领域是什么? 三、认证程序和培训<...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...