设计模式全解析:23种经典设计模式及其应用

创建型模式

1. 单例模式(Singleton Pattern)

  • 核心思想:确保一个类只有一个实例,并提供一个全局访问点。
  • 适用场景:需要共享资源的场景,如配置管理、日志记录等。
public class Singleton {// 静态变量保存单例实例private static Singleton instance;// 私有构造函数,防止外部实例化private Singleton() {}// 提供获取实例的全局访问点public static Singleton getInstance() {if (instance == null) { // 如果实例为空,则创建instance = new Singleton();}return instance; // 返回单例实例}
}

2. 工厂方法模式(Factory Method Pattern)

  • 核心思想:定义一个创建对象的接口,但由子类决定实例化哪一个类。
  • 适用场景:需要延迟到子类进行对象实例化时。
// 产品接口
interface Product {}// 具体产品类
class ConcreteProduct implements Product {}// 工厂接口
interface Creator {Product factoryMethod(); // 工厂方法,用于创建产品
}// 具体工厂类
class ConcreteCreator implements Creator {public Product factoryMethod() {return new ConcreteProduct(); // 返回具体产品实例}
}

3. 抽象工厂模式(Abstract Factory Pattern)

  • 核心思想:提供一个接口,创建一系列相关或依赖对象,而无需指定具体类。
  • 适用场景:需要创建一组相关或互相依赖的对象时。
// 抽象产品A
interface ProductA {}// 抽象产品B
interface ProductB {}// 具体产品A1
class ProductA1 implements ProductA {}// 具体产品B1
class ProductB1 implements ProductB {}// 抽象工厂接口
interface AbstractFactory {ProductA createProductA(); // 创建产品A的方法ProductB createProductB(); // 创建产品B的方法
}// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {public ProductA createProductA() {return new ProductA1(); // 创建具体产品A1}public ProductB createProductB() {return new ProductB1(); // 创建具体产品B1}
}

4. 建造者模式(Builder Pattern)

  • 核心思想:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
  • 适用场景:需要构建复杂对象时,且构建过程独立于表示。
// 产品类
class Product {private String partA;private String partB;// 设置部件Apublic void setPartA(String partA) {this.partA = partA;}// 设置部件Bpublic void setPartB(String partB) {this.partB = partB;}
}// 建造者接口
interface Builder {void buildPartA(); // 构建部件Avoid buildPartB(); // 构建部件BProduct getResult(); // 获取构建的产品
}// 具体建造者
class ConcreteBuilder implements Builder {private Product product = new Product();public void buildPartA() {product.setPartA("PartA"); // 设置产品的部件A}public void buildPartB() {product.setPartB("PartB"); // 设置产品的部件B}public Product getResult() {return product; // 返回构建的产品}
}

5. 原型模式(Prototype Pattern)

  • 核心思想:通过复制现有实例来创建新对象,避免重复初始化。
  • 适用场景:需要大量相似对象时。
// 原型类
class Prototype implements Cloneable {// 克隆方法public Prototype clone() throws CloneNotSupportedException {return (Prototype) super.clone(); // 调用父类的克隆方法}
}

结构型模式

6. 适配器模式(Adapter Pattern)

  • 核心思想:将一个类的接口转换成客户期望的另一个接口。
  • 适用场景:接口不兼容但需要协同工作的类。
// 目标接口
interface Target {void request();
}// 被适配的类
class Adaptee {void specificRequest() {// 特殊请求}
}// 适配器类
class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest(); // 转发请求到被适配对象}
}

7. 桥接模式(Bridge Pattern)

  • 核心思想:将抽象部分与实现部分分离,使它们可以独立变化。
  • 适用场景:需要跨越多个平台的对象。
// 实现接口
interface Implementor {void operationImpl();
}// 具体实现类A
class ConcreteImplementorA implements Implementor {public void operationImpl() {// 具体实现}
}// 抽象类
abstract class Abstraction {protected Implementor implementor;protected Abstraction(Implementor implementor) {this.implementor = implementor;}public abstract void operation(); // 抽象方法
}// 扩展抽象类
class RefinedAbstraction extends Abstraction {public RefinedAbstraction(Implementor implementor) {super(implementor);}public void operation() {implementor.operationImpl(); // 调用实现方法}
}

8. 组合模式(Composite Pattern)

  • 核心思想:将对象组合成树形结构以表示“部分-整体”的层次结构。
  • 适用场景:需要处理树形结构数据时。
// 组件接口
interface Component {void operation();
}// 叶子节点
class Leaf implements Component {public void operation() {// 叶子节点的操作}
}// 组合节点
class Composite implements Component {private List<Component> children = new ArrayList<>();// 添加子节点public void add(Component component) {children.add(component);}public void operation() {for (Component child : children) {child.operation(); // 递归调用子节点的操作}}
}

9. 装饰器模式(Decorator Pattern)

  • 核心思想:动态地给对象添加一些额外的职责。
  • 适用场景:需要扩展类的功能时。
// 组件接口
interface Component {void operation();
}// 具体组件
class ConcreteComponent implements Component {public void operation() {// 基本操作}
}// 装饰器抽象类
abstract class Decorator implements Component {protected Component component;protected Decorator(Component component) {this.component = component;}public void operation() {component.operation(); // 调用被装饰对象的操作}
}// 具体装饰器
class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super(component);}public void operation() {super.operation();// 添加额外的操作}
}

10. 外观模式(Facade Pattern)

  • 核心思想:为子系统中的一组接口提供一个一致的界面。
  • 适用场景:简化复杂系统的使用。
// 子系统A
class SubsystemA {void operationA() {// 子系统A的操作}
}// 子系统B
class SubsystemB {void operationB() {// 子系统B的操作}
}// 外观类
class Facade {private SubsystemA subsystemA = new SubsystemA();private SubsystemB subsystemB = new SubsystemB();// 提供的统一接口void operation() {subsystemA.operationA(); // 调用子系统A的方法subsystemB.operationB(); // 调用子系统B的方法}
}

11. 享元模式(Flyweight Pattern)

  • 核心思想:运用共享技术有效地支持大量细粒度对象。
  • 适用场景:需要大量创建对象时,减少内存消耗。
// 享元类
class Flyweight {private String intrinsicState; // 内部状态public Flyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}// 操作方法,传入外部状态void operation(String extrinsicState) {// 使用内部状态和外部状态}
}// 享元工厂
class FlyweightFactory {private Map<String, Flyweight> flyweights = new HashMap<>();// 获取享元对象public Flyweight getFlyweight(String key) {if (!flyweights.containsKey(key)) {flyweights.put(key, new Flyweight(key)); // 创建新享元对象}return flyweights.get(key); // 返回享元对象}
}

12. 代理模式(Proxy Pattern)

  • 核心思想:为其他对象提供一种代理,以控制对这个对象的访问。
  • 适用场景:需要控制对象访问权限时。
// 抽象主题
interface Subject {void request();
}// 真实主题
class RealSubject implements Subject {public void request() {// 真实请求的处理}
}// 代理类
class Proxy implements Subject {private RealSubject realSubject;public void request() {if (realSubject == null) {realSubject = new RealSubject(); // 延迟初始化}realSubject.request(); // 转发请求}
}

行为型模式

13. 责任链模式(Chain of Responsibility Pattern)

  • 核心思想:避免请求发送者与接收者耦合,让多个对象都有机会处理请求。
  • 适用场景:请求需要多个对象处理时。
// 处理者抽象类
abstract class Handler {protected Handler successor; // 后继者// 设置后继者public void setSuccessor(Handler successor) {this.successor = successor;}// 处理请求public abstract void handleRequest();
}// 具体处理者1
class ConcreteHandler1 extends Handler {public void handleRequest() {if (successor != null) {successor.handleRequest(); // 转发请求}}
}

14. 命令模式(Command Pattern)

  • 核心思想:将请求封装成对象,从而使你可用不同的请求对客户进行参数化。
  • 适用场景:需要对请求排队、日志、撤销操作时。
// 命令接口
interface Command {void execute();
}// 具体命令
class ConcreteCommand implements Command {private Receiver receiver; // 命令的接收者public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}public void execute() {receiver.action(); // 执行接收者的动作}
}// 接收者
class Receiver {void action() {// 执行动作}
}// 调用者
class Invoker {private Command command;// 设置命令public void setCommand(Command command) {this.command = command;}// 执行命令public void executeCommand() {command.execute();}
}

15. 解释器模式(Interpreter Pattern)

  • 核心思想:为给定的语言定义文法表示,并定义一个解释器来处理这个文法。
  • 适用场景:需要解释一种语言时。
// 表达式接口
interface Expression {int interpret();
}// 数字表达式
class Number implements Expression {private int number;public Number(int number) {this.number = number;}public int interpret() {return number; // 返回数字的值}
}// 加法表达式
class Plus implements Expression {private Expression leftOperand;private Expression rightOperand;public Plus(Expression left, Expression right) {this.leftOperand = left;this.rightOperand = right;}public int interpret() {return leftOperand.interpret() + rightOperand.interpret(); // 返回加法结果}
}

16. 迭代器模式(Iterator Pattern)

  • 核心思想:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。
  • 适用场景:需要遍历聚合对象时。
// 迭代器接口
interface Iterator {boolean hasNext(); // 是否有下一个元素Object next(); // 获取下一个元素
}// 聚合接口
interface Aggregate {Iterator createIterator(); // 创建迭代器
}// 具体聚合类
class ConcreteAggregate implements Aggregate {private List<Object> items = new ArrayList<>();public Iterator createIterator() {return new ConcreteIterator(this); // 创建具体迭代器}
}// 具体迭代器
class ConcreteIterator implements Iterator {private ConcreteAggregate aggregate;private int index;public ConcreteIterator(ConcreteAggregate aggregate) {this.aggregate = aggregate;}public boolean hasNext() {return index < aggregate.items.size(); // 判断是否有下一个元素}public Object next() {return aggregate.items.get(index++); // 返回下一个元素}
}

17. 中介者模式(Mediator Pattern)

  • 核心思想:用一个中介对象来封装一系列对象的交互,使得对象之间不需要显式地相互引用。
  • 适用场景:需要减少对象之间的依赖时。
// 中介者接口
interface Mediator {void notify(Component sender, String event); // 通知方法
}// 具体中介者
class ConcreteMediator implements Mediator {private Component1 component1;private Component2 component2;// 注册组件1public void registerComponent1(Component1 component) {this.component1 = component;}// 注册组件2public void registerComponent2(Component2 component) {this.component2 = component;}public void notify(Component sender, String event) {if (sender == component1 && event.equals("A")) {component2.doSomething(); // 组件1触发事件A,组件2响应} else if (sender == component2 && event.equals("B")) {component1.doSomething(); // 组件2触发事件B,组件1响应}}
}// 组件抽象类
abstract class Component {protected Mediator mediator;public Component(Mediator mediator) {this.mediator = mediator;}
}// 组件1
class Component1 extends Component {public Component1(Mediator mediator) {super(mediator);}public void doSomething() {mediator.notify(this, "A"); // 执行操作并通知中介者}
}// 组件2
class Component2 extends Component {public Component2(Mediator mediator) {super(mediator);}public void doSomething() {mediator.notify(this, "B"); // 执行操作并通知中介者}
}

18. 备忘录模式(Memento Pattern)

  • 核心思想:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
  • 适用场景:需要保存和恢复对象状态时。
// 备忘录类
class Memento {private String state; // 状态public Memento(String state) {this.state = state;}public String getState() {return state; // 获取状态}
}// 原发器类
class Originator {private String state;public void setState(String state) {this.state = state; // 设置状态}public Memento saveStateToMemento() {return new Memento(state); // 保存状态到备忘录}public void getStateFromMemento(Memento memento) {state = memento.getState(); // 从备忘录恢复状态}
}// 管理者类
class Caretaker {private List<Memento> mementoList = new ArrayList<>();public void add(Memento state) {mementoList.add(state); // 添加备忘录}public Memento get(int index) {return mementoList.get(index); // 获取备忘录}
}

19. 观察者模式(Observer Pattern)

  • 核心思想:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知并被自动更新。
  • 适用场景:需要观察对象状态变化时。
// 观察者接口
interface Observer {void update(String state); // 更新方法
}// 具体观察者
class ConcreteObserver implements Observer {public void update(String state) {// 处理更新}
}// 主题类
class Subject {private List<Observer> observers = new ArrayList<>(); // 观察者列表private String state;public void attach(Observer observer) {observers.add(observer); // 添加观察者}public void setState(String state) {this.state = state;notifyAllObservers(); // 通知所有观察者}private void notifyAllObservers() {for (Observer observer : observers) {observer.update(state); // 更新观察者}}
}

20. 状态模式(State Pattern)

  • 核心思想:允许对象在内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
  • 适用场景:对象状态改变时行为也改变时。
// 状态接口
interface State {void handle(Context context); // 处理方法
}// 具体状态A
class ConcreteStateA implements State {public void handle(Context context) {context.setState(new ConcreteStateB()); // 转换到状态B}
}// 具体状态B
class ConcreteStateB implements State {public void handle(Context context) {context.setState(new ConcreteStateA()); // 转换到状态A}
}// 上下文类
class Context {private State state;public Context(State state) {this.state = state; // 设置初始状态}public void setState(State state) {this.state = state; // 设置状态}public void request() {state.handle(this); // 请求处理}
}

21. 策略模式(Strategy Pattern)

  • 核心思想:定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。
  • 适用场景:需要动态选择算法时。
// 策略接口
interface Strategy {void execute(); // 执行方法
}// 具体策略A
class ConcreteStrategyA implements Strategy {public void execute() {// 策略A的实现}
}// 具体策略B
class ConcreteStrategyB implements Strategy {public void execute() {// 策略B的实现}
}// 上下文类
class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy; // 设置初始策略}public void setStrategy(Strategy strategy) {this.strategy = strategy; // 设置策略}public void executeStrategy() {strategy.execute(); // 执行策略}
}

22. 模板方法模式(Template Method Pattern)

  • 核心思想:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
  • 适用场景:多个类有相似算法时。
// 抽象类
abstract class AbstractClass {// 模板方法public final void templateMethod() {primitiveOperation1();primitiveOperation2();}// 基本操作1protected abstract void primitiveOperation1();// 基本操作2protected abstract void primitiveOperation2();
}// 具体类
class ConcreteClass extends AbstractClass {protected void primitiveOperation1() {// 实现基本操作1}protected void primitiveOperation2() {// 实现基本操作2}
}

23. 访问者模式(Visitor Pattern)

  • 核心思想:将数据结构和作用于结构上的操作解耦,使得操作集合可独立变化。
  • 适用场景:需要对对象结构中的对象实施多种操作时。
// 访问者接口
interface Visitor {void visit(ElementA element);void visit(ElementB element);
}// 元素接口
interface Element {void accept(Visitor visitor); // 接受访问者
}// 具体元素A
class ElementA implements Element {public void accept(Visitor visitor) {visitor.visit(this); // 接受访问者}
}// 具体元素B
class ElementB implements Element {public void accept(Visitor visitor) {visitor.visit(this); // 接受访问者}
}// 具体访问者
class ConcreteVisitor implements Visitor {public void visit(ElementA element) {// 访问元素A的操作}public void visit(ElementB element) {// 访问元素B的操作}
}

总结

设计模式为我们提供了一种标准化的解决方案,可以应对软件开发中常见的问题。通过理解和应用这些模式,我们可以编写出更具可维护性、可扩展性和可重用性的代码。希望这篇博客能帮助你更好地理解和使用设计模式。每种模式都有其独特的应用场景,选择合适的模式可以显著提高代码质量和开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣热题100题解(c++)—矩阵

73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 int m matrix.size(); // 行数int n matrix[0].size(); // 列数bool firstRowZero false; // 标记第一行是否包含 0bool f…

本地部署DeepSeek-R1(Dify升级最新版本、新增插件功能、过滤推理思考过程)

下载最新版本Dify Dify1.0版本之前不支持插件功能&#xff0c;先升级DIfy 下载最新版本&#xff0c;目前1.0.1 Git地址&#xff1a;https://github.com/langgenius/dify/releases/tag/1.0.1 我这里下载到老版本同一个目录并解压 拷贝老数据 需先停用老版本Dify PS D:\D…

PostSwigger Web 安全学习:CSRF漏洞3

CSRF 漏洞学习网站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF Token 基本原理 CSRF Token 是服务端生成的唯一、随机且不可预测的字符串&#xff0c;用于验证客户端合法校验。 作用&#xff1a;防止攻击…

用 Nodemon 解决 npm run serve 频繁重启服务

Nodemon 是一个基于 Node.js 构建的开发工具&#xff0c;专为帮助开发者自动监控项目文件的更改而设计。每当文件发生变更时&#xff0c;Nodemon 会自动重启 Node.js 服务器&#xff0c;无需手动停止并重启。这对于提升开发速度、减少人工操作非常有帮助&#xff0c;尤其适用于…

django admin 中更新表数据 之后再将数据返回管理界面

在Django中&#xff0c;更新数据库中的数据并将其重新显示在Django Admin界面上通常涉及到几个步骤。这里我将详细说明如何在Django Admin中更新表数据&#xff0c;并确保更新后的数据能够立即在管理界面上显示。 定义模型 首先&#xff0c;确保你的模型&#xff08;Model&…

真.从“零”搞 VSCode+STM32CubeMx+C <1>构建

目录 前言 准备工作 创建STM32CubeMx项目 VSCode导入项目&配置 构建错误调试 后记 前言 去年10月开始接触单片机&#xff0c;一直在用树莓派的Pico&#xff0c;之前一直用Micropython&#xff0c;玩的不亦乐乎&#xff0c;试错阶段优势明显&#xff0c;很快就能鼓捣一…

C语言学习之结构体

在C语言中&#xff0c;我们已经学了好几种类型的数据。比如整型int、char、short等&#xff0c;浮点型double、float等。但是这些都是基本数据类型&#xff0c;而这些数据类型应用在实际编程里显然是不够用的。比如我们没有办法用一旦数据类型来定义一个”人“的属性。因此这里…

架构-计算机系统基础

计算机系统基础 一、计算机系统组成 &#xff08;一&#xff09;计算机系统层次结构 硬件组成 主机&#xff1a;包含CPU&#xff08;运算器控制器&#xff09;、主存储器&#xff08;内存&#xff09;。外设&#xff1a;输入设备、输出设备、辅助存储器&#xff08;外存&…

【计算机网络性能优化】从基础理论到实战调优

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1&#xff1a;iPerf3带宽测试案例2&#xff1a;TCP窗口优化案例3&#xff1a;QoS流量整形 运行…

Python 自动化办公:Excel 数据处理的“秘密武器”

引言 在日常的 IT 办公场景里&#xff0c;Excel 是数据处理与分析的 “常胜将军”。无论是财务人员整理账目、销售团队统计业绩&#xff0c;还是运营人员分析用户数据&#xff0c;Excel 都发挥着关键作用。但面对海量数据&#xff0c;手动操作 Excel 不仅效率低下&#xff0c;还…

缓存集群技术深度解析:从原理到实战

缓存集群技术深度解析&#xff1a;从原理到实战 一、缓存集群核心定位与架构选型 1. 集群模式核心价值 缓存集群通过数据分片、高可用保障、水平扩展解决单节点瓶颈&#xff0c;核心能力包括&#xff1a; 数据分片&#xff1a;将数据分散到多个节点&#xff0c;突破单节点内…

CSDN编辑文章时如何自动生成目录

如何自动生成目录 前置条件1. 插入目录标识符2. 编写标题层级 前置条件 需要使用markdown编辑&#xff0c;并且只有按照markdown语法编写不同的标题级别&#xff0c;才能使用这个方法自动生成对应的目录。 1. 插入目录标识符 在文章的顶部添加以下代码&#xff1a; [TOC](文…

产品经理对于电商接口的梳理||电商接口文档梳理与接入

接口梳理7个注意点总结 ①注意要测试环境和生产环境。生产上线时候要提醒研发换到生产环境调用。 ②注意必输字段和选输字段&#xff0c;要传入字段的含义和校验。枚举值不清楚含义的要询问对方含义&#xff0c;比如说单据类型字段枚举值是B2C发货单&#xff0c;BBC发货单&am…

更快的图像局部修改与可控生成:Flex.2-preview

Flex.2-preview 文本生成图像扩散模型介绍 一、模型简介 Flex.2-preview 是一种 开源的 80 亿参数文本生成图像扩散模型&#xff0c;具备通用控制和修复支持功能&#xff0c;是 Flex.1alpha 的下一代版本。该模型由社区开发并为社区服务&#xff0c;采用 Apache 2.0 许可证&a…

【Castle-X机器人】一、模块安装与调试:机器人底盘

持续更新。。。。。。。。。。。。。。。 【ROS机器人】模块安装 一、Castle-X机器人底盘1.1 结构概述1.2 驱动执行结构1.3 环境传感器1.4 电气系统1.5 Castle-x机器人底盘测试激光雷达传感器测试及数据可视化超声波传感器实时数据获取防跌落传感器测试陀螺仪测试键盘控制测试…

条件、列表渲染.

#### v-for 1. 渲染列表 vue <template> <ul v-for"(item,index) in list" > <li>{{ item }}</li> </ul> </template> <script setup> import { ref } from vue; let list ref([苹果, 香蕉, 橙子]) </script>…

node20的安装和vue的入门准备

一、node20的安装 直接下载路径&#xff1a;https://nodejs.org/download/release/v20.11.0/node-v20.11.0-x64.msi 安装&#xff0c;双击msi文件 点击同意协议 更改下载路径 什么也不用选&#xff0c;点击next进行下一步 什么也不用选&#xff0c;点击next进行下一步 点击安…

从 Java 到 Kotlin:在现有项目中迁移的最佳实践!

全文目录&#xff1a; 开篇语 1. 为什么选择 Kotlin&#xff1f;1.1 Kotlin 与 Java 的兼容性1.2 Kotlin 的优势1.3 Kotlin 的挑战 2. Kotlin 迁移最佳实践2.1 渐进式迁移2.1.1 步骤一&#xff1a;将 Kotlin 集成到现有的构建工具中2.1.2 步骤二&#xff1a;逐步迁移2.1.3 步骤…

威雅利电子|业界领先的高隔离度用于5G基站的吸收式SPDT开关“NT1819“

业界领先的高隔离度 用于5G基站的吸收式SPDT开关"NT1819" 为了实现智能社会&#xff0c;已经启动了5G服务。这样&#xff0c;高速、低延迟、大容量的数据通信成为可能&#xff0c;也给我们的生活和工业发展带来了巨大的变化。 在5G基站有很多天线&#xff0c;每个天…

Diamond软件的使用--(6)访问FPGA的专用SPI接口

1.什么是FPGA的专用SPI接口&#xff1f; 此处的SPI FLASH接口即为FPGA的专用SPI接口&#xff0c;上电时&#xff0c;FPGA从该FLASH读出程序并运行。 2.访问SPI PROM需要注意哪些地方&#xff1f; 1&#xff09;处于MASTER SPI MODE 2&#xff09;调用USRMCLK原语&#xff0c;…