计算机编程中的设计模式及其在简化复杂系统设计中的应用

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

计算机编程中的设计模式及其在简化复杂系统设计中的应用

计算机编程中的设计模式及其在简化复杂系统设计中的应用

  • 计算机编程中的设计模式及其在简化复杂系统设计中的应用
    • 引言
    • 设计模式概述
      • 什么是设计模式
      • 设计模式的优势
      • 设计模式的分类
    • 创建型模式
      • 1. 单例模式(Singleton Pattern)
      • 2. 工厂方法模式(Factory Method Pattern)
      • 3. 抽象工厂模式(Abstract Factory Pattern)
    • 结构型模式
      • 1. 适配器模式(Adapter Pattern)
      • 2. 装饰器模式(Decorator Pattern)
      • 3. 代理模式(Proxy Pattern)
    • 行为型模式
      • 1. 观察者模式(Observer Pattern)
      • 2. 策略模式(Strategy Pattern)
      • 3. 命令模式(Command Pattern)
    • 设计模式在简化复杂系统设计中的应用
      • 1. 提高代码的可维护性和可扩展性
      • 2. 降低系统的耦合度
      • 3. 提高代码的重用性
      • 4. 促进团队协作
      • 5. 解决复杂的设计问题
    • 实际案例:使用设计模式简化一个电子商务系统的开发
      • 1. 使用单例模式管理数据库连接
      • 2. 使用工厂方法模式创建订单
      • 3. 使用适配器模式集成第三方支付系统
      • 4. 使用观察者模式处理订单状态变化
      • 5. 使用策略模式处理不同的支付方式
    • 结论
    • 参考资料

引言

设计模式是在软件设计过程中总结出来的一些通用解决方案,旨在解决常见的设计问题。通过使用设计模式,可以简化复杂系统的开发,提高代码的可维护性和可扩展性。本文将详细介绍设计模式的基本概念、分类、实现方式以及在简化复杂系统设计中的应用。

设计模式概述

什么是设计模式

设计模式是在软件设计过程中总结出来的一些通用解决方案,旨在解决常见的设计问题。设计模式不是具体的代码,而是解决问题的一种模板或蓝图。

设计模式的优势

  1. 重用性:设计模式提供了解决常见问题的通用方法,可以重复使用。
  2. 可维护性:使用设计模式可以使代码结构更加清晰,易于维护。
  3. 可扩展性:设计模式可以提高系统的可扩展性,便于未来的修改和扩展。
  4. 团队协作:设计模式提供了一种共同的语言,便于团队成员之间的沟通和协作。

设计模式的分类

设计模式通常分为三类:

  1. 创建型模式:关注对象的创建过程,提供了一种创建对象的最佳方式。
  2. 结构型模式:关注类或对象的组合,提供了一种将类或对象组合成更大的结构的方法。
  3. 行为型模式:关注对象之间的职责分配,提供了一种定义对象之间交互的方式。

创建型模式

1. 单例模式(Singleton Pattern)

单例模式确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton {private static 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 Pattern)

工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。

public abstract class Creator {public abstract Product factoryMethod();public void doSomething() {Product product = factoryMethod();product.use();}
}public class ConcreteCreator extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProduct();}
}public interface Product {void use();
}public class ConcreteProduct implements Product {@Overridepublic void use() {System.out.println("Using ConcreteProduct");}
}

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

抽象工厂模式提供了一个创建一系列相关或依赖对象的接口,而无需指定它们具体的类。

public interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}public class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}public class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}public interface ProductA {void useA();
}public interface ProductB {void useB();
}public class ConcreteProductA1 implements ProductA {@Overridepublic void useA() {System.out.println("Using ConcreteProductA1");}
}public class ConcreteProductB1 implements ProductB {@Overridepublic void useB() {System.out.println("Using ConcreteProductB1");}
}public class ConcreteProductA2 implements ProductA {@Overridepublic void useA() {System.out.println("Using ConcreteProductA2");}
}public class ConcreteProductB2 implements ProductB {@Overridepublic void useB() {System.out.println("Using ConcreteProductB2");}
}

结构型模式

1. 适配器模式(Adapter Pattern)

适配器模式将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

public interface Target {void request();
}public class Adaptee {public void specificRequest() {System.out.println("Specific Request");}
}public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}public class Client {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}

2. 装饰器模式(Decorator Pattern)

装饰器模式允许向一个对象动态地添加功能,而不影响该对象所属类的其他对象。

public interface Component {void operation();
}public class ConcreteComponent implements Component {@Overridepublic void operation() {System.out.println("ConcreteComponent Operation");}
}public abstract class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}@Overridepublic void operation() {component.operation();}
}public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedBehavior();}private void addedBehavior() {System.out.println("Added Behavior A");}
}public class ConcreteDecoratorB extends Decorator {public ConcreteDecoratorB(Component component) {super(component);}@Overridepublic void operation() {super.operation();addedBehavior();}private void addedBehavior() {System.out.println("Added Behavior B");}
}public class Client {public static void main(String[] args) {Component component = new ConcreteComponent();Component decoratedA = new ConcreteDecoratorA(component);Component decoratedB = new ConcreteDecoratorB(decoratedA);decoratedB.operation();}
}

3. 代理模式(Proxy Pattern)

代理模式为其他对象提供一种代理以控制对这个对象的访问。

public interface Subject {void request();
}public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject Request");}
}public class Proxy implements Subject {private RealSubject realSubject;@Overridepublic void request() {if (realSubject == null) {realSubject = new RealSubject();}preRequest();realSubject.request();postRequest();}private void preRequest() {System.out.println("Pre Request");}private void postRequest() {System.out.println("Post Request");}
}public class Client {public static void main(String[] args) {Subject proxy = new Proxy();proxy.request();}
}

行为型模式

1. 观察者模式(Observer Pattern)

观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

import java.util.ArrayList;
import java.util.List;public interface Observer {void update(String message);
}public interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String message);
}public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}public class ConcreteObserver implements Observer {@Overridepublic void update(String message) {System.out.println("Received: " + message);}
}public class Client {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver();Observer observer2 = new ConcreteObserver();subject.registerObserver(observer1);subject.registerObserver(observer2);subject.notifyObservers("Hello Observers");}
}

2. 策略模式(Strategy Pattern)

策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。

public interface Strategy {void execute();
}public class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Executing Strategy A");}
}public class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Executing Strategy B");}
}public 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();}
}public class Client {public static void main(String[] args) {Context context = new Context(new ConcreteStrategyA());context.executeStrategy();context.setStrategy(new ConcreteStrategyB());context.executeStrategy();}
}

3. 命令模式(Command Pattern)

命令模式将请求封装成对象,从而使不同的请求可以有不同的参数,也可以将请求排队。命令模式支持可撤销的操作。

public interface Command {void execute();
}public class Receiver {public void action() {System.out.println("Receiver Action");}
}public class ConcreteCommand implements Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void execute() {receiver.action();}
}public class Invoker {private Command command;public void setCommand(Command command) {this.command = command;}public void invoke() {command.execute();}
}public class Client {public static void main(String[] args) {Receiver receiver = new Receiver();Command command = new ConcreteCommand(receiver);Invoker invoker = new Invoker();invoker.setCommand(command);invoker.invoke();}
}

图示:设计模式的基本概念和分类

设计模式在简化复杂系统设计中的应用

1. 提高代码的可维护性和可扩展性

设计模式提供了一种结构化的方式来组织代码,使得代码更加模块化和易于维护。通过使用设计模式,可以更容易地进行代码的扩展和修改。

2. 降低系统的耦合度

设计模式通过抽象和封装,降低了系统各部分之间的耦合度,使得系统更加灵活和可复用。

3. 提高代码的重用性

设计模式提供了解决常见问题的通用方法,可以重复使用这些方法,减少重复代码的编写。

4. 促进团队协作

设计模式提供了一种共同的语言,便于团队成员之间的沟通和协作。通过使用设计模式,团队成员可以更快地理解彼此的代码。

5. 解决复杂的设计问题

设计模式提供了一种系统化的方法来解决复杂的设计问题,使得开发人员可以更专注于业务逻辑的实现。

图示:使用设计模式简化一个电子商务系统的开发的具体步骤

实际案例:使用设计模式简化一个电子商务系统的开发

假设我们正在开发一个电子商务系统,需要处理用户订单、支付和物流等复杂功能。以下是具体的步骤和代码示例:

1. 使用单例模式管理数据库连接

使用单例模式确保数据库连接只有一个实例,提高性能和资源利用率。

public class DatabaseConnection {private static DatabaseConnection instance;private Connection connection;private DatabaseConnection() {// 初始化数据库连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ecommerce", "user", "password");}public static DatabaseConnection getInstance() {if (instance == null) {synchronized (DatabaseConnection.class) {if (instance == null) {instance = new DatabaseConnection();}}}return instance;}public Connection getConnection() {return connection;}
}

2. 使用工厂方法模式创建订单

使用工厂方法模式创建不同类型的订单,提高代码的可扩展性。

public abstract class OrderFactory {public abstract Order createOrder();
}public class DomesticOrderFactory extends OrderFactory {@Overridepublic Order createOrder() {return new DomesticOrder();}
}public class InternationalOrderFactory extends OrderFactory {@Overridepublic Order createOrder() {return new InternationalOrder();}
}public interface Order {void placeOrder();
}public class DomesticOrder implements Order {@Overridepublic void placeOrder() {System.out.println("Placing domestic order");}
}public class InternationalOrder implements Order {@Overridepublic void placeOrder() {System.out.println("Placing international order");}
}public class Client {public static void main(String[] args) {OrderFactory factory = new DomesticOrderFactory();Order order = factory.createOrder();order.placeOrder();}
}

3. 使用适配器模式集成第三方支付系统

使用适配器模式将第三方支付系统的接口适配到系统的支付接口,提高系统的灵活性。

public interface PaymentGateway {void processPayment(double amount);
}public class ThirdPartyPaymentSystem {public void makePayment(double amount) {System.out.println("Processing payment of $" + amount + " via third-party system");}
}public class PaymentAdapter implements PaymentGateway {private ThirdPartyPaymentSystem thirdPartyPaymentSystem;public PaymentAdapter(ThirdPartyPaymentSystem thirdPartyPaymentSystem) {this.thirdPartyPaymentSystem = thirdPartyPaymentSystem;}@Overridepublic void processPayment(double amount) {thirdPartyPaymentSystem.makePayment(amount);}
}public class Client {public static void main(String[] args) {ThirdPartyPaymentSystem thirdPartyPaymentSystem = new ThirdPartyPaymentSystem();PaymentGateway paymentGateway = new PaymentAdapter(thirdPartyPaymentSystem);paymentGateway.processPayment(100.0);}
}

4. 使用观察者模式处理订单状态变化

使用观察者模式监听订单状态的变化,并通知相关的组件进行相应的处理。

import java.util.ArrayList;
import java.util.List;public interface OrderStatusObserver {void onOrderStatusChanged(Order order);
}public interface OrderStatusSubject {void registerObserver(OrderStatusObserver observer);void removeObserver(OrderStatusObserver observer);void notifyObservers(Order order);
}public class Order implements OrderStatusSubject {private List<OrderStatusObserver> observers = new ArrayList<>();private String status;@Overridepublic void registerObserver(OrderStatusObserver observer) {observers.add(observer);}@Overridepublic void removeObserver(OrderStatusObserver observer) {observers.remove(observer);}@Overridepublic void notifyObservers(Order order) {for (OrderStatusObserver observer : observers) {observer.onOrderStatusChanged(order);}}public void setStatus(String status) {this.status = status;notifyObservers(this);}
}public class OrderStatusLogger implements OrderStatusObserver {@Overridepublic void onOrderStatusChanged(Order order) {System.out.println("Order status changed to: " + order.getStatus());}
}public class Client {public static void main(String[] args) {Order order = new Order();OrderStatusObserver logger = new OrderStatusLogger();order.registerObserver(logger);order.setStatus("Processing");order.setStatus("Shipped");}
}

5. 使用策略模式处理不同的支付方式

使用策略模式根据不同的支付方式选择不同的支付策略,提高系统的灵活性。

public interface PaymentStrategy {void pay(double amount);
}public class CreditCardStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying $" + amount + " using credit card");}
}public class PayPalStrategy implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paying $" + amount + " using PayPal");}
}public class PaymentContext {private PaymentStrategy strategy;public PaymentContext(PaymentStrategy strategy) {this.strategy = strategy;}public void setStrategy(PaymentStrategy strategy) {this.strategy = strategy;}public void processPayment(double amount) {strategy.pay(amount);}
}public class Client {public static void main(String[] args) {PaymentContext context = new PaymentContext(new CreditCardStrategy());context.processPayment(100.0);context.setStrategy(new PayPalStrategy());context.processPayment(200.0);}
}

结论

设计模式是在软件设计过程中总结出来的一些通用解决方案,旨在解决常见的设计问题。通过使用设计模式,可以简化复杂系统的开发,提高代码的可维护性和可扩展性。本文详细介绍了设计模式的基本概念、分类、实现方式以及在简化复杂系统设计中的应用,并通过一个实际案例展示了如何使用设计模式简化一个电子商务系统的开发。尽管设计模式面临一些挑战,但随着技术的不断进步,设计模式在现代软件开发中的应用将越来越广泛。

参考资料

  • Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides
  • Head First Design Patterns by Eric Freeman and Elisabeth Robson
  • Refactoring to Patterns by Joshua Kerievsky
  • Design Patterns in Modern JavaScript by Adam Boduch
  • Gang of Four (GoF) Design Patterns

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

latex中,两个相邻的表格,怎样留一定的空白

目录 问题描述 问题解决 问题描述 在使用latex写论文时&#xff0c;经常表格需要置顶写&#xff0c;则会出现两个表格连在一起的情况。下一个表名容易与上面的横线相连&#xff0c;如何通过明令&#xff0c;留出一定的空白。 问题解决 在第二个表格的 \centering命令之后…

leetcode01——合并两个有序数组

0.本题学到的知识 1.python的操作中&#xff0c;哪些是在原数据上进行操作的&#xff1f; 新开辟的行为&#xff1a;list1list1[m:n] 原数据&#xff1a;list1[a:b]list1[m:n] 新开辟&#xff1a;list1list1list2 原数据&#xff1a;list1.append(list2[i]); list1.extend(list…

深度学习的艺术:揭秘卷积神经网络(CNN)的神秘面纱

深度学习的艺术&#xff1a;揭秘卷积神经网络&#xff08;CNN&#xff09;的神秘面纱 一、CNN的构成要素二、CNN的工作流程三、CNN的应用领域四、CNN的优势与局限 #引言&#xff1a; 在人工智能的璀璨星空中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;如同一颗耀眼的…

Linux高阶——1116—环形队列生产者消费者

目录 1、环形队列 2、生产者消费者 环形队列数组实现代码 成功截图 1、环形队列 相比于线性队列&#xff0c;环形队列可以有效避免访问越界问题&#xff0c;使用下标访问队列元素时&#xff0c;到达末尾后下标归0&#xff0c;返回起始位置&#xff0c;使用下标运算即可 a…

学习大数据DAY61 宽表加工

目录 模型设计 加工宽表 任务调度&#xff1a; 大表 - 把很多数据整合起来 方便后续的明细查询和指标计算 模型设计 设计 建模 设计: excel 文档去编写 建模: 使用建模工具 PowerDesigner Navicat 在线画图工具... 把表结构给绘 制出来 共享\项目课工具\pd 加工宽表 数…

DBeaver MACOS 安装 并连接到docker安装的mysql

官网下载&#xff1a;Download | DBeaver Community 网盘下载&#xff1a;链接: https://pan.baidu.com/s/15fAhbflHO-AGc-uAnc3Rjw?pwdbrz9 提取码: brz9 下载驱动 连接测试 报错 null, message from server: "Host 172.17.0.1 is not allowed to connect to this M…

24首届数证杯(流量分析部分)

目录 流量分析 流量分析 1、分析网络流量包检材&#xff0c;写出抓取该流量包时所花费的秒数?(填写数字&#xff0c;答案格式:10) 3504相加即可 2、分析网络流量包检材&#xff0c;抓取该流量包时使用计算机操作系统的build版本是多少? 23F793、分析网络流量包检材&#x…

云服务器ECS经济型e实例和通用算力u1实例有啥区别?

阿里云服务器ECS经济型e实例怎么样&#xff1f;对比ECS通用算力型u1实例哪个更好&#xff1f;u1实例更好。阿里云服务器网aliyunfuwuqi.com二者均为云服务器ECS的实例规格&#xff0c;e实例是共享型云服务器&#xff0c;u1实例是独享型云服务器&#xff0c;何为共享&#xff1f…

QT中使用图表之QChart绘制柱状图

绘制条形&#xff08;柱状&#xff09;图&#xff0c;系列选择条形系列QBarSeries x轴选择条形图的种类轴QBarCategoryAxis 1、创建图表视图 //1、创建图表视图 QChartView * view new QChartView(this); //开启抗锯齿 view -> setRenderHint(QPainter::Antialiasing); …

Essential Cell Biology--Fifth Edition--Chapter one (8)

1.1.4.6 The Cytoskeleton [细胞骨架] Is Responsible for Directed Cell Movements 细胞质基液不仅仅是一种无结构的化学物质和细胞器的混合物[soup]。在电子显微镜下&#xff0c;我们可以看到真核细胞的细胞质基液是由长而细的丝交叉而成的。通常[Frequently]&#xff0c;可…

【Linux】守护进程

目录 进程组 会话 作业控制 实现守护进程 我们在写完一些网络服务后&#xff0c;如果想让这个服务一直在云服务器的后台运行着&#xff0c;那该如何实现呢&#xff1f;其实就用到了这篇博客要讲的守护进程 进程组 我们首先需要了解进程组的概念&#xff0c;其实sleep 1000这…

nginx.conf配置文件中的命令

打开我们的conf文件 nginx.conf文件中&#xff0c;分为3大块&#xff1a; 全局块&#xff0c;就是events和http块之外的内容。设置nginx服务器整体运行的指令 格式为&#xff1a; 指令名 指令值 events块&#xff0c;用于配置与用户的网络连接的内容&#xff0c;对nginx的…

51单片机基础07 实时时钟-思路及代码参考1

目录 一、实现功能 二、思路1的分析 1、定时器0 2、外部中断0 3、主函数main 4、其他重要功能函数 一、实现功能 1、实现最基本的计时功能&#xff0c;显示时、分、秒&#xff0c;可以通过按键设置时间。 要求&#xff1a;时钟计时精确&#xff0c;按键操作不影响计时。…

vTESTstudio系列15--vTESTstudio-Doors的需求和测试用例的管理

最近有朋友在咨询vTESTstudio中怎么去跟Doors里面的需求去做好管理这方面的问题&#xff0c;临时加两篇文章介绍一下,Lets Go!!! 目录 1.Doors的配置&#xff1a; 1.1 安装Doors AddIn for vTESTstudio&#xff1a; 1.2 更新XML脚本&#xff1a; 1.3 导出需求的Trace Item…

基于Java Springboot编程语言在线学习平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

JDK安装报错“以下应用程序正在使用需要由此安装程序更新的文件”

&#xff08;一&#xff09;问题描述 我刚刚没有截图&#xff0c;这是我在网上看到的图&#xff1a; &#xff08;二&#xff09;可能的解决办法 1. 下方工具栏右键&#xff0c;打开任务管理器按钮&#xff0c;在进程中找到“Java Platform SE binary” 进程&#xff0c;右键结…

数据库第3次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…

Linux之文件系统,软硬连接和动静态库

Linux之文件系统&#xff0c;软硬连接和动静态库 一.文件系统1.1磁盘的存储结构1.2CHS和LBA1.3ext2文件系统 二.软硬连接2.1软链接2.2硬链接 三.静态库和动态库3.1静态库与动态库的概念3.2静态库的创建与使用3.3动态库的创建与使用3.4动态库的加载 一.文件系统 在上篇的学习中…

【项目开发】URL中井号(#)的技术细节

未经许可,不得转载。 文章目录 前言一、# 的基本含义二、# 不参与 HTTP 请求三、# 后的字符处理机制四、# 的变化不会触发网页重新加载五、# 的变化会记录在浏览器历史中六、通过 window.location.hash 操作七、onhashchange 事件八、Google 对 # 的处理机制前言 2023 年 9 月…

TikZ 绘图学习笔记

这篇笔记的所有代码如下&#xff1a; % !TEX TS-program pdflatex % !TEX encoding UTF-8 Unicode% This is a simple template for a LaTeX document using the "article" class. % See "book", "report", "letter" for other typ…