设计模式说明
23种设计模式说明
以下是常见的 23 种设计模式 分类及其核心思想、应用场景和简单代码示例,帮助你在实际开发中灵活运用:
一、创建型模式(5种)
解决对象创建问题,降低对象耦合。
1. 单例模式(Singleton)
-
核心思想:确保一个类只有一个实例,并提供全局访问点。
-
场景:数据库连接池、配置管理、日志对象。
-
示例:
public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;} }
2. 工厂方法模式(Factory Method)
-
核心思想:定义创建对象的接口,由子类决定实例化哪个类。
-
场景:日志记录器、数据库连接工厂。
-
示例:
interface Product {void use(); }class ConcreteProductA implements Product {public void use() { System.out.println("Product A"); } }abstract class Creator {public abstract Product createProduct(); }class ConcreteCreatorA extends Creator {public Product createProduct() { return new ConcreteProductA(); } }
3. 抽象工厂模式(Abstract Factory)
-
核心思想:提供一个接口,创建一系列相关或依赖对象。
-
场景:跨平台的 UI 组件库(如按钮、文本框)。
-
示例:
interface Button { void render(); } interface TextField { void input(); }class WindowsButton implements Button { public void render() { /* Windows 风格按钮 */ } } class MacButton implements Button { public void render() { /* Mac 风格按钮 */ } }interface GUIFactory {Button createButton();TextField createTextField(); }class WindowsFactory implements GUIFactory {public Button createButton() { return new WindowsButton(); }public TextField createTextField() { return new WindowsTextField(); } }
4. 建造者模式(Builder)
-
核心思想:分步骤构建复杂对象,隔离构造细节。
-
场景:构造复杂对象(如 SQL 查询、HTTP 请求)。
-
示例:
java
复制
class Computer {private String cpu;private String ram;// 省略其他属性和构造方法static class Builder {private String cpu;private String ram;public Builder setCpu(String cpu) { this.cpu = cpu; return this; }public Builder setRam(String ram) { this.ram = ram; return this; }public Computer build() { return new Computer(this); }} }// 使用 Computer computer = new Computer.Builder().setCpu("Intel i7").setRam("16GB").build();
5. 原型模式(Prototype)
-
核心思想:通过复制现有对象来创建新对象。
-
场景:避免重复初始化开销(如游戏中的怪物生成)。
-
示例:
java
复制
interface Prototype extends Cloneable {Prototype clone(); }class ConcretePrototype implements Prototype {public Prototype clone() {return (ConcretePrototype) super.clone();} }
二、结构型模式(7种)
处理类或对象的组合,构建灵活结构。
6. 适配器模式(Adapter)
-
核心思想:将一个接口转换为另一个客户端期望的接口。
-
场景:整合不兼容的第三方库。
-
示例:
java
复制
class LegacyLibrary {public void specificRequest() { /* 旧接口 */ } }interface Target {void request(); }class Adapter implements Target {private LegacyLibrary legacy;public Adapter(LegacyLibrary legacy) { this.legacy = legacy; }public void request() { legacy.specificRequest(); } } - 备注实战经验:接口转换的中间层,比如标准品接口视作标准,分别对接不同的客户,为了减少标准品的改动,添加一层专门对接客户的接口适配层。
7. 装饰器模式(Decorator)
-
核心思想:动态地为对象添加额外职责。
-
场景:Java I/O 流(如
BufferedReader装饰FileReader)。 -
示例:
java
复制
interface Coffee {double getCost();String getDescription(); }class SimpleCoffee implements Coffee {public double getCost() { return 1.0; }public String getDescription() { return "Coffee"; } }abstract class CoffeeDecorator implements Coffee {protected Coffee decoratedCoffee;public CoffeeDecorator(Coffee coffee) { this.decoratedCoffee = coffee; } }class MilkDecorator extends CoffeeDecorator {public MilkDecorator(Coffee coffee) { super(coffee); }public double getCost() { return super.getCost() + 0.5; }public String getDescription() { return super.getDescription() + ", Milk"; } }
8. 代理模式(Proxy)
-
核心思想:为其他对象提供一种代理以控制访问。
-
场景:延迟加载(Lazy Initialization)、权限控制。
-
示例:
interface Image {void display(); }class RealImage implements Image {public RealImage(String filename) { loadFromDisk(filename); }private void loadFromDisk(String filename) { /* 加载图片 */ }public void display() { /* 显示图片 */ } }class ProxyImage implements Image {private RealImage realImage;private String filename;public ProxyImage(String filename) { this.filename = filename; }public void display() {if (realImage == null) {realImage = new RealImage(filename);}realImage.display();} }
9. 外观模式(Facade)
-
核心思想:为复杂子系统提供一个统一的高层接口。
-
场景:简化 API 调用(如订单支付流程封装)。
-
示例:
java
复制
class PaymentService {public void processPayment() { /* 处理支付 */ } } class InventoryService {public void updateInventory() { /* 更新库存 */ } }class OrderFacade {private PaymentService paymentService;private InventoryService inventoryService;public void placeOrder() {paymentService.processPayment();inventoryService.updateInventory();} } - 备注实战:入库场景下各种入库复杂场景,统一封装一个高阶入库接口,用于处理所有入库逻辑,函数内部通过查询sku对比订单信息来决定那种业务类型入库。
10. 桥接模式(Bridge)
-
核心思想:将抽象与实现分离,使它们可以独立变化。
-
场景:跨平台图形渲染(如不同操作系统下的绘图 API)。
-
示例:
java
复制
interface Renderer {void renderCircle(float radius); }class VectorRenderer implements Renderer {public void renderCircle(float radius) { /* 矢量渲染 */ } }abstract class Shape {protected Renderer renderer;public Shape(Renderer renderer) { this.renderer = renderer; }abstract void draw(); }class Circle extends Shape {private float radius;public Circle(Renderer renderer, float radius) {super(renderer);this.radius = radius;}public void draw() { renderer.renderCircle(radius); } }
三、行为型模式(11种)
关注对象之间的通信和职责分配。
11. 观察者模式(Observer)
-
核心思想:定义对象间的一对多依赖,当一个对象状态改变时,所有依赖者自动更新。
-
场景:事件驱动系统(如 GUI 按钮点击事件)。
-
示例:
java
复制
interface Observer {void update(String message); }class ConcreteObserver implements Observer {public void update(String message) { System.out.println("Received: " + message); } }class Subject {private List<Observer> observers = new ArrayList<>();public void addObserver(Observer observer) { observers.add(observer); }public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}} } - 备注实战:消息队列
12. 策略模式(Strategy)
-
核心思想:定义一系列算法,封装每个算法,并使它们可互换。
-
场景:支付方式选择(支付宝、微信、信用卡)。
-
示例:
java
复制
interface PaymentStrategy {void pay(int amount); }class AlipayStrategy implements PaymentStrategy {public void pay(int amount) { /* 支付宝支付 */ } }class Context {private PaymentStrategy strategy;public void setStrategy(PaymentStrategy strategy) { this.strategy = strategy; }public void executePayment(int amount) { strategy.pay(amount); } } - 备注实战:报表的统一路由,根据不同类型选择不同报表设计。
13. 模板方法模式(Template Method)
-
核心思想:定义一个算法的骨架,将某些步骤延迟到子类实现。
-
场景:框架中的流程控制(如 Spring 的 JdbcTemplate)。
-
示例:
java
复制
abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();public final void play() {initialize();startPlay();endPlay();} }class Cricket extends Game {void initialize() { /* 初始化板球游戏 */ }void startPlay() { /* 开始游戏 */ }void endPlay() { /* 结束游戏 */ } }
14. 责任链模式(Chain of Responsibility)
-
核心思想:将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
-
场景:审批流程、异常处理链。
-
示例:
java
复制
abstract class Handler {protected Handler next;public void setNext(Handler next) { this.next = next; }public abstract void handleRequest(int request); }class ConcreteHandlerA extends Handler {public void handleRequest(int request) {if (request <= 10) { /* 处理请求 */ }else if (next != null) { next.handleRequest(request); }} } - 备注实战:事件监听,一个业务流程完成后,广播一条通知,监听端分别做对应收尾工作。
四、设计模式总结
-
优先理解问题场景:不要为了用模式而用模式。
-
关注开闭原则(OCP):通过扩展而非修改现有代码来实现变化。
-
框架中的应用:如 Spring 的依赖注入(工厂模式)、AOP(代理模式)。
附:模式速查表
| 类型 | 模式名称 | 一句话核心思想 |
|---|---|---|
| 创建型 | 单例、工厂、建造者 | 灵活创建对象,解耦实例化过程 |
| 结构型 | 适配器、代理、装饰器 | 组合对象,构建灵活结构 |
| 行为型 | 观察者、策略、模板方法 | 定义对象交互方式,解耦行为逻辑 |
掌握这些模式能显著提升代码的可维护性和扩展性!
Spring boot中的设计模式
Spring Boot 作为 Spring 框架的扩展,在底层大量使用了设计模式来简化开发、提高扩展性和维护性。以下是 Spring Boot 中常见的 设计模式及其应用场景 的详细解析:
1. 单例模式(Singleton)
-
应用场景:Spring 容器管理的 Bean 默认是单例的,确保全局唯一实例。
-
源码示例:
java
复制
@Service public class UserService {// 默认单例,Spring 容器中只有一个 UserService 实例 } -
实现原理:通过
DefaultSingletonBeanRegistry的singletonObjects缓存管理单例 Bean。
2. 工厂方法模式(Factory Method)
-
应用场景:Bean 的创建通过工厂方法解耦。
-
源码示例:
java
复制
@Configuration public class AppConfig {@Bean // 工厂方法,由 Spring 调用此方法创建 DataSource 实例public DataSource dataSource() {return new HikariDataSource();} } -
扩展应用:
BeanFactory接口定义了 Bean 的工厂方法getBean()。
3. 抽象工厂模式(Abstract Factory)
-
应用场景:根据不同环境创建不同的 Bean(如多数据源)。
-
源码示例:
java
复制
@Configuration public class DataSourceConfig {@Bean@Profile("dev") // 根据 Profile 选择工厂实现public DataSource devDataSource() { /* 开发环境数据源 */ }@Bean@Profile("prod")public DataSource prodDataSource() { /* 生产环境数据源 */ } }
4. 模板方法模式(Template Method)
-
应用场景:定义算法骨架,子类实现具体步骤(如
JdbcTemplate)。 -
源码示例:
java
复制
public class JdbcTemplate extends JdbcAccessor {public <T> T query(String sql, ResultSetExtractor<T> rse) {// 定义执行流程:获取连接、创建语句、执行查询、处理结果Connection con = DataSourceUtils.getConnection(getDataSource());Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(sql);return rse.extractData(rs); // 由回调处理结果} }
5. 代理模式(Proxy)
-
应用场景:AOP 切面编程、事务管理。
-
源码示例:
java
复制
@Service public class UserService {@Transactional // Spring 通过动态代理添加事务管理逻辑public void saveUser(User user) { /* ... */ } } -
实现原理:
-
使用 JDK 动态代理(基于接口)或 CGLIB(基于类)生成代理对象。
-
代理类在方法调用前后插入切面逻辑(如
@Around通知)。
-
6. 适配器模式(Adapter)
-
应用场景:Spring MVC 中的
HandlerAdapter处理不同类型的控制器。 -
源码示例:
java
复制
public class RequestMappingHandlerAdapter implements HandlerAdapter {public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 将 HTTP 请求适配到 @RequestMapping 方法} }
7. 观察者模式(Observer)
-
应用场景:Spring 事件驱动模型(如
ApplicationEvent和ApplicationListener)。 -
源码示例:
java
复制
// 自定义事件 public class OrderCreatedEvent extends ApplicationEvent { /* ... */ }// 监听事件 @Component public class EmailListener implements ApplicationListener<OrderCreatedEvent> {public void onApplicationEvent(OrderCreatedEvent event) {// 发送邮件通知} }// 发布事件 @Autowired private ApplicationEventPublisher publisher; publisher.publishEvent(new OrderCreatedEvent(this, order));
8. 策略模式(Strategy)
-
应用场景:多数据源路由、缓存策略选择。
-
源码示例:
java
复制
public interface CacheStrategy {Object get(String key); }@Component("redisCache") public class RedisCacheStrategy implements CacheStrategy { /* ... */ }@Component("localCache") public class LocalCacheStrategy implements CacheStrategy { /* ... */ }// 根据条件动态选择策略 @Autowired private Map<String, CacheStrategy> strategies;public CacheStrategy getStrategy(String type) {return strategies.get(type + "Cache"); }
9. 装饰器模式(Decorator)
-
应用场景:增强请求/响应对象(如
HttpServletRequestWrapper)。 -
源码示例:
java
复制
public class CachingHttpServletRequest extends HttpServletRequestWrapper {private byte[] cachedBody;public CachingHttpServletRequest(HttpServletRequest request) {super(request);// 缓存请求体以便多次读取this.cachedBody = StreamUtils.copyToByteArray(request.getInputStream());}@Overridepublic ServletInputStream getInputStream() {return new CachedBodyServletInputStream(cachedBody);} }
10. 责任链模式(Chain of Responsibility)
-
应用场景:Spring Security 的过滤器链、拦截器链。
-
源码示例:
java
复制
public class SecurityFilterChain {private List<Filter> filters;public void doFilter(ServletRequest request, ServletResponse response) {for (Filter filter : filters) {filter.doFilter(request, response, chain);}} }
11. 建造者模式(Builder)
-
应用场景:构建复杂配置对象(如
SpringApplicationBuilder)。 -
源码示例:
java
复制
new SpringApplicationBuilder().sources(Parent.class).child(Application.class).bannerMode(Banner.Mode.OFF).run(args);
总结
Spring Boot 通过灵活运用设计模式,实现了以下目标:
-
解耦与扩展性:如工厂模式、策略模式。
-
代码复用:如模板方法模式、装饰器模式。
-
动态行为控制:如代理模式、观察者模式。
-
简化复杂逻辑:如建造者模式、责任链模式。
理解这些模式在 Spring Boot 中的应用,有助于更好地掌握框架设计思想,并在实际开发中编写高内聚、低耦合的代码。
相关文章:
设计模式说明
23种设计模式说明 以下是常见的 23 种设计模式 分类及其核心思想、应用场景和简单代码示例,帮助你在实际开发中灵活运用: 一、创建型模式(5种) 解决对象创建问题,降低对象耦合。 1. 单例模式(Singleton&…...
【STM32F103ZET6——库函数】11.捕获红外信号
目录 红外原理 数据码 引导码 连发码 配置捕获引脚 使能引脚时钟 配置定时器 使能定时器时钟 配置输入捕获 中断优先级分组 配置定时器4中断 定时器中断使能 使能定时器 重写定时器中断服务函数 清空定时器中断标志位 例程 例程说明 main.h main.c HongWai…...
unity调用本地部署deepseek全流程
unity调用本地部署deepseek全流程 deepseek本地部署 安装Ollama 搜索并打开Ollama官网[Ollama](https://ollama.com/download) 点击Download下载对应版本 下载后点击直接安装 安装deepseek大语言模型 官网选择Models 选择deepseek-r1,选择对应的模型࿰…...
Anaconda 部署 DeepSeek
可以通过 Anaconda 环境部署 DeepSeek 模型,但需结合 PyTorch 或 TensorFlow 等深度学习框架,并手动配置依赖项。 一、Anaconda 部署 DeepSeek 1. 创建并激活 Conda 环境 conda create -n deepseek python3.10 # 推荐 Python 3.8-3.10 conda activate…...
Mac OS升级后变慢了,如何恢复老系统?
我的一台Mac Air闲置很久了,原因是某次系统升级后用着会卡,有差不多10年没用了。今天想试着恢复一下出厂系统,目前看这条路可以走通。记录如下: 1、去哪里下载旧版系统? https://support.apple.com/zh-cn/102662 2、…...
AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例
文生图即以文字描述来生成图像,这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片,除了选择好的模型,在文生图中,提示词特别关键。 一、什么是提示词(Prompt) 提示词又称创意、关键词、咒语、ca…...
SAP监控体系和机制
SAP监控体系 SAP监控体系是一个多层次、多维度的综合系统,旨在确保SAP系统的性能、可用性、安全性和稳定性。以下是SAP监控体系的主要组成部分: 1. 技术监控(Technical Monitoring) 目标:监控SAP系统的基础设施和技术…...
算法-贪心篇01-分发饼干
分发饼干 力扣题目链接 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼…...
SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决
介绍一下我的是ubuntu20.04.机载电脑是orinnx,通过源码烧写的系统。 首先打开终端,输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容, ONNX(Open Neural Network E…...
【YashanDB认证】yashandb23.3.1 个人版单机部署安装实践
YCA报名链接如下: YashanDB|崖山数据库系统YashanDB学习中心-YCA认证详情 目前免费 主要参考文档: 单机(主备)部署 | YashanDB Doc 另外还参考摩天轮文章: YashanDB 23.2.9.101 企业版安装步骤抢先看! - 墨天轮 …...
ProfibusDP主站转ModbusTCP网关如何进行数据互换
ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域,通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准,广泛应用于工业控制网络中;而Modbus TCP作为基于以太网的通信协议,因其简单易…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Qt 实现绘图板(支持橡皮擦与 Ctrl+Z 撤销功能)[特殊字符]
作业: 1:实现绘图的时候,颜色的随时调整 2:追加橡皮擦功能 3:配合键盘事件,实现功能 当键盘按 ctrlz的时候,撤销最后一次绘图 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidge…...
基于STM32的智能家居蓝牙系统(论文+源码)
1总体方案设计 本次基于STM32的智能家居蓝牙系统,其系统总体架构如图2.1所示,采用STM32f103单片机作为控制器,通过DHT11传感器实现温湿度检测,MQ-2烟雾传感器实现烟雾检测,光敏电阻实现光照检测,同时将数据…...
系统架构设计师—数据库基础篇—关系代数运算
文章目录 名词选择运算示例1示例2 投影示例1 笛卡尔积示例1 连接等值连接示例1 自然连接示例1 外连接左外连接右外连接完全外连接 名词 关系:二维表的表名。 元组:二维表中的一行,在数据库中称为记录。 属性:二维表中的一列&am…...
el-table一格两行;概率;find
样式: 根据概率表头关键代码:rateRanges; scope.row.targetHitTable.find((target:any) > target.targetHitRate > range.min && target.targetHitRate < range.max)!.targetHitNum (1)!.是TypeScri…...
前端跨域设置 withCredentials: true
在做登录认证的时候,会出现请求未登录的情况,查看请求头的时候发现并没有把登录时的cookie设置到第二次的请求头里面。查看资料才知道跨域请求要想带上cookie,必须要在ajax请求里加上 withCredentials: true 再次访问发现请求头可以携带cook…...
Vue 文件下载功能的跨域处理与前后端实现详解
在 Web 应用开发中,文件下载功能是常见需求。但由于跨域限制和认证机制的复杂性,实际开发中常遇到下载失败或权限错误等问题。本文将结合 Vue 前端和 Spring Boot 后端,详细介绍文件下载功能的实现与跨域问题的解决方案。 一、问题背景 在某…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_read_token - 详解(3)
详解(3) if (last_space) {start b->pos - 1;start_line cf->conf_file->line;if (ch || ch \t || ch CR || ch LF) {continue;}switch (ch) {case ;:case {:if (cf->args->nelts 0) {ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,…...
私有云基础架构与运维(一)
私有云基础架构与运维(OpenStackopenEuler版) 项目一.OpenStack 云计算基础架构平台概述 任务1.1 安装部署虚拟化环境 通过安装 openEuler-22.09 操作系统来熟悉虚拟机的安装,在操作过程中熟悉计算机虚 拟化资源的分配管理。 1.1.1 VMware…...
代码随想录算法训练营第35天 | 01背包问题二维、01背包问题一维、416. 分割等和子集
一、01背包问题二维 二维数组,一维为物品,二维为背包重量 import java.util.Scanner;public class Main{public static void main(String[] args){Scanner scanner new Scanner(System.in);int n scanner.nextInt();int bag scanner.nextInt();int[…...
大学至今的反思与总结
现在是2025年的3月5日,我大三下学期。 自大学伊始,我便以考研作为自己的目标,有时还会做自己考研上岸头部985,211,offer如潮水般涌来的美梦。 但是我却忽略了一点,即便我早早下定了决心去考研,但并没有早…...
PySide(PyQT)的视图(QGraphicsView)范例(一) 基本框架
最近学习了视图(QGraphicsView)的知识,总结一下,做一个demo以备忘。在demo中演示了常用的设置方法和信号槽传递机制。 QT的视图(QGraphicsView)体系是建立在场景(QGraphicsScene)基础…...
深入理解seata使用和源码分析
一、数据库事务ACID特性 基础概念:事务ACID A(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失 败的情况。C(Consistency):一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转100元, 转账前和…...
centos8更换阿里云yum源
1.centos8更换为阿里云yum源 2.更换阿里云Yum-centos8源 mv /etc/yum.repos.d/CentOS-Stream-BaseOS.repo /etc/yum.repos.d/CentOS-Stream-BaseOS.repo.backupcurl -o /etc/yum.repos.d/CentOS-Stream-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-8.repowget -O /et…...
单粒子翻转对FPGA的影响及解决方法
1 单粒子翻转对FPGA 的影响 对于在轨的空间应用而言,需要考虑外太空辐射对电子元器件带来的影响,包括单粒子翻转(Single Event Upset,SEU)、多粒子翻转(Multiple Bit Upset,MBU)、单粒子瞬态效应(Single Event Transient,SET)、单粒子功能中断(SingleEvent Functi…...
君正SOC芯片 T31X智能视频应用处理器 高集成度 超低功耗 提供软硬件资料+样品测试
君正(Ingenic)T31X是一款面向智能视频应用的高性能、低功耗处理器,适用于安防监控、智能家居和物联网等领域。以下是其主要技术参数: 1. 处理器(CPU): 架构:XBurst-1内核主频&…...
基于Python Django的人脸识别上课考勤系统(附源码,部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
论述AI对学习发展的改变(网页设计)
谈自己对AI看法 AI,即人工智能,是当今科技领域最具影响力和变革性的技术之一,对其看法可以从多个方面来探讨 积极方面 强大的技术能力 高效的数据处理出色的学习能力广泛的应用价值改善生活质量科学研究的有力助手加速科学发现 挑战和问题 伦…...
JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–组成3–内置对象 2. 组成 一直都在说JS,JS,到底啥是JS有了解过吗?JS由哪几部分组成的呢? 定义: JavaScript是一种轻量级、解释型或即时编译型的编程语…...
