Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】

Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】

目录

Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】

一、简单介绍

二、中介者模式(Mediator Pattern)

1、什么时候使用中介者模式

2、使用中介者模式的好处

3、使用时的注意事项

三、在 Unity 中使用 中介者模式

1、定义中介者接口

2、实现具体中介者

3、定义角色类

4、定义敌人类

5、创建游戏管理器

6、在 Unity 中测试

7、运行示例

8、示例分析

1、什么时候使用迭代器模式

2、使用迭代器模式的好处

3、使用时的注意事项

五、在 Unity 中使用 迭代器模式

1、定义迭代器接口

2、定义聚合接口

3、定义敌人类

4、实现敌人集合

5、实现具体迭代器

6、创建游戏管理器

7、在 Unity 中测试

8、示例分析

六、解释器模式(Interpreter Pattern)

1、什么时候使用解释器模式

2、使用解释器模式的好处

3、使用时的注意事项

七、在 Unity 中使用 解释器模式

1、定义抽象表达式类

2、实现具体表达式类

3、创建上下文类

4、创建游戏管理器

5、在 Unity 中测试

6、示例分析


一、简单介绍

设计模式 是指在软件开发中为解决常见问题而总结出的一套 可复用的解决方案。这些模式是经过长期实践证明有效的 编程经验总结,并可以在不同的项目中复用。设计模式并不是代码片段,而是对常见问题的 抽象解决方案,它提供了代码结构和模块间交互的一种设计思路,帮助开发者解决特定的设计问题。

设计模式的特点:

  1. 通用性:设计模式针对的是软件开发中常见的设计问题,适用于各种软件工程项目。
  2. 可复用性:设计模式可以在不同项目和环境下被重复使用,提高代码的可维护性和扩展性。
  3. 可扩展性:设计模式有助于让代码结构更加灵活,易于扩展和修改。
  4. 模块化:通过设计模式,可以减少代码的耦合性,增强模块间的独立性。
  5. 提高沟通效率:设计模式为开发者提供了一种通用的设计语言,使得团队成员能够快速理解并讨论设计方案。

二、中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介者对象来封装一组对象之间的交互。中介者负责协调这些对象之间的通信,而不是让对象直接引用彼此。这种方式降低了对象之间的耦合度,使得系统更加灵活和易于维护。

1、什么时候使用中介者模式

  1. 多个对象之间存在复杂交互时:当多个对象相互作用频繁且复杂,直接交互会增加代码的复杂性,适合使用中介者模式。
  2. 希望简化对象间的通信:当对象间的交互逻辑非常复杂时,使用中介者可以帮助理清思路,集中管理交互逻辑。
  3. 需要动态改变交互规则时:如果对象的交互逻辑可能发生变化,使用中介者可以在不影响对象本身的情况下,灵活调整交互规则。

2、使用中介者模式的好处

  1. 降低耦合性:中介者模式将对象之间的直接交互转化为通过中介者的间接交互,减少了对象间的依赖关系,从而降低了耦合度。
  2. 集中控制交互:所有对象之间的交互逻辑都集中在中介者中,便于管理和修改,增强了系统的可维护性。
  3. 简化对象之间的交互:通过中介者,可以简化复杂的交互逻辑,使得对象的实现变得更加简单和清晰。
  4. 提高可扩展性:如果需要新增对象或修改现有对象的交互,只需调整中介者,而无需修改每个对象的实现,提高了系统的灵活性。

3、使用时的注意事项

  1. 避免中介者过于复杂:中介者的职责应该专注于协调对象之间的交互,避免将过多的逻辑集中在一个类中,以免形成“上帝对象”。
  2. 简单交互不必使用中介者:对于简单的对象交互,直接通信可能更合适,使用中介者会引入不必要的复杂性。
  3. 保持中介者的单一职责:确保中介者只负责对象之间的交互,避免将其他职责混合到中介者中,以保持其清晰性和可维护性。

总之,中介者模式通过引入一个中介者对象来集中管理对象之间的交互,降低耦合性,简化系统的复杂性,适用于多对象复杂交互的场景。

三、在 Unity 中使用 中介者模式

在 Unity 中实现 中介者模式 的示例,我们可以创建一个简单的场景,其中多个对象(例如角色、敌人和 UI 元素)通过一个中介者来协调交互。这个示例将演示如何使用中介者模式来处理玩家与敌人之间的交互以及与 UI 的更新。

使用中介者模式协调角色与敌人的交互

参考类图如下:

1、定义中介者接口

首先,我们定义一个中介者接口,描述所有参与者和中介者的基本交互。

public interface IMediator
{void Notify(object sender, string ev);
}
2、实现具体中介者

接着,我们实现一个具体的中介者类,负责处理角色和敌人之间的交互。

using UnityEngine;public class GameMediator : IMediator
{private Player player;private Enemy enemy;public GameMediator(Player player, Enemy enemy){this.player = player;this.enemy = enemy;}public void Notify(object sender, string ev){if (ev == "PlayerAttack"){enemy.TakeDamage(player.AttackPower);}else if (ev == "EnemyAttack"){player.TakeDamage(enemy.AttackPower);}}
}
3、定义角色类

接下来,我们定义一个角色类,代表玩家,具有攻击和受伤的能力。

using UnityEngine;public class Player : MonoBehaviour
{public int Health { get; private set; } = 100;public int AttackPower { get; private set; } = 20;private IMediator mediator;public void SetMediator(IMediator mediator){this.mediator = mediator;}public void Attack(){Debug.Log("Player attacks!");mediator.Notify(this, "PlayerAttack");}public void TakeDamage(int damage){Health -= damage;Debug.Log($"Player takes damage: {damage}. Current Health: {Health}");}
}
4、定义敌人类

同样,我们定义一个敌人类,具有攻击和受伤的能力。

using UnityEngine;public class Enemy : MonoBehaviour
{public int Health { get; private set; } = 50;public int AttackPower { get; private set; } = 10;private IMediator mediator;public void SetMediator(IMediator mediator){this.mediator = mediator;}public void Attack(){Debug.Log("Enemy attacks!");mediator.Notify(this, "EnemyAttack");}public void TakeDamage(int damage){Health -= damage;Debug.Log($"Enemy takes damage: {damage}. Current Health: {Health}");}
}
5、创建游戏管理器

我们创建一个游戏管理器类,用于初始化中介者并控制游戏逻辑。

using UnityEngine;public class GameManager : MonoBehaviour
{private Player player;private Enemy enemy;private GameMediator mediator;void Start(){player = FindObjectOfType<Player>();enemy = FindObjectOfType<Enemy>();// 创建中介者并设置参与者mediator = new GameMediator(player, enemy);player.SetMediator(mediator);enemy.SetMediator(mediator);// 模拟攻击player.Attack();enemy.Attack();}
}

6、在 Unity 中测试

  1. 创建一个空的 GameObject,命名为 GameManager,并附加 GameManager 脚本。
  2. 创建一个球体作为玩家对象,附加 Player 脚本。
  3. 创建一个立方体作为敌人对象,附加 Enemy 脚本。

7、运行示例

在游戏运行时,玩家和敌人会通过中介者进行交互。每当玩家或敌人攻击时,相应的 Notify 方法将被调用,更新各自的生命值并在控制台中输出信息。

8、示例分析

  • 中介者(GameMediator):负责协调玩家和敌人之间的交互,处理攻击事件。
  • 发起人(Player 和 Enemy):代表参与交互的对象,通过中介者进行通信,避免直接引用彼此。
  • 灵活性:通过中介者的引入,我们可以方便地扩展功能,例如添加更多的角色或交互,而无需修改已有对象的实现。

通过这个示例,我们展示了如何在 Unity 中实现 中介者模式,使用中介者来协调对象之间的交互,简化了对象间的通信,提高了系统的可维护性和灵活性。

四、迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个集合对象中的元素,而不需要暴露该对象的内部表示。迭代器模式通常包含两个角色:迭代器(Iterator)聚合(Aggregate)。迭代器负责遍历集合中的元素,而聚合提供迭代器的接口。

1、什么时候使用迭代器模式

  1. 需要访问集合对象的元素但不想暴露其内部结构时:例如,封装了复杂数据结构的类,希望对外提供简单的遍历接口。
  2. 需要在多个遍历中保持独立状态时:当需要同时遍历一个集合的多个迭代器时,迭代器模式能够轻松实现。
  3. 需要支持不同的遍历方式时:如果集合对象的元素需要按照不同的方式(如正序、倒序)遍历,迭代器模式提供了灵活性。

2、使用迭代器模式的好处

  1. 封装性:通过迭代器,客户端不需要知道集合的内部结构,避免了对集合实现细节的直接依赖。
  2. 简化遍历操作:迭代器提供了一种一致的方法来遍历不同类型的集合,客户端代码更加简洁和统一。
  3. 支持多重遍历:可以同时在一个集合上创建多个迭代器,各自独立地遍历集合,而不影响其他迭代器的状态。
  4. 易于扩展:如果需要改变集合的遍历方式,只需修改迭代器的实现,而无需修改集合的实现。

3、使用时的注意事项

  1. 避免过度设计:对于简单的集合,使用迭代器模式可能会导致过度复杂化。在简单情况下,直接使用循环遍历可能更为合适。
  2. 管理迭代器的生命周期:要注意迭代器的创建和销毁,确保没有资源泄露或意外访问已经释放的对象。
  3. 性能考虑:如果迭代器的实现涉及到大量的状态管理,可能会影响性能。在性能敏感的场景下,需谨慎使用。

迭代器模式通过提供统一的遍历接口,使得客户端可以在不需要了解集合内部结构的情况下访问元素,提升了系统的封装性和可维护性。它适用于需要遍历复杂集合对象的场景,能够提供灵活的遍历方式。

五、在 Unity 中使用 迭代器模式

在 Unity 中实现 迭代器模式 的示例,我们可以创建一个场景,其中一个自定义集合(例如一个物体池)可以通过迭代器模式进行遍历。这个示例将演示如何使用迭代器模式来管理和遍历游戏中的对象,比如多个敌人。

使用迭代器模式遍历敌人集合

参考类图如下:

1、定义迭代器接口

首先,我们定义一个迭代器接口,描述迭代器的基本操作。

public interface IEnemyIterator
{bool HasNext();Enemy Next();
}
2、定义聚合接口

然后,我们定义一个聚合接口,描述如何创建迭代器。

public interface IEnemyCollection
{IEnemyIterator CreateIterator();
}
3、定义敌人类

接下来,我们定义一个简单的敌人类,表示游戏中的敌人对象。

using UnityEngine;public class Enemy
{public string Name { get; set; }public int Health { get; set; }public Enemy(string name, int health){Name = name;Health = health;}
}

4、实现敌人集合

我们实现一个具体的敌人集合类,用于存储和管理敌人对象,并实现聚合接口。

using System.Collections.Generic;public class EnemyCollection : IEnemyCollection
{private List<Enemy> enemies = new List<Enemy>();public void AddEnemy(Enemy enemy){enemies.Add(enemy);}public IEnemyIterator CreateIterator(){return new EnemyIterator(this);}public int Count => enemies.Count;public Enemy GetEnemy(int index){return enemies[index];}
}

5、实现具体迭代器

接下来,实现一个具体的迭代器类,用于遍历敌人集合。

public class EnemyIterator : IEnemyIterator
{private EnemyCollection collection;private int currentIndex = 0;public EnemyIterator(EnemyCollection collection){this.collection = collection;}public bool HasNext(){return currentIndex < collection.Count;}public Enemy Next(){return collection.GetEnemy(currentIndex++);}
}

6、创建游戏管理器

我们创建一个游戏管理器类,用于初始化敌人集合,并使用迭代器遍历敌人。

using UnityEngine;public class GameManager : MonoBehaviour
{private EnemyCollection enemyCollection;void Start(){enemyCollection = new EnemyCollection();// 添加敌人enemyCollection.AddEnemy(new Enemy("Goblin", 100));enemyCollection.AddEnemy(new Enemy("Orc", 150));enemyCollection.AddEnemy(new Enemy("Troll", 200));// 使用迭代器遍历敌人IEnemyIterator iterator = enemyCollection.CreateIterator();while (iterator.HasNext()){Enemy enemy = iterator.Next();Debug.Log($"Enemy: {enemy.Name}, Health: {enemy.Health}");}}
}
7、在 Unity 中测试
  1. 创建一个空的 GameObject,命名为 GameManager,并附加 GameManager 脚本。
  2. 运行游戏,查看控制台输出的敌人信息。
8、示例分析
  • 聚合(EnemyCollection):存储多个敌人对象,并提供创建迭代器的方法。
  • 迭代器(EnemyIterator):实现了迭代器接口,负责遍历敌人集合。
  • 灵活性:通过迭代器,我们能够方便地遍历敌人集合,且无需了解集合的具体实现。

这个示例展示了如何在 Unity 中实现 迭代器模式,使用迭代器来遍历一个自定义的敌人集合,增强了代码的可读性和可维护性。

六、解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern)是一种行为型设计模式,它提供了一种评估语言的语法或表达式的方式。通过定义文法规则和解释这些规则的解释器,可以对输入的句子或表达式进行解析和执行。该模式常用于编写简单的编程语言、表达式解析器或其他需要解析文本的应用程序。

1、什么时候使用解释器模式

  1. 需要定义文法的上下文时:当需要解析的语言或表达式的语法规则较为复杂,且需要频繁使用时。
  2. 需要对表达式进行求值时:当程序需要执行或评估某些输入表达式时,例如计算器或简单编程语言的实现。
  3. 文法相对简单:解释器模式更适用于简单的语法或规则,对于复杂的语言,可能不够灵活或高效。

2、使用解释器模式的好处

  1. 易于扩展:通过定义新的解释器,可以方便地扩展现有文法,而不需要修改现有代码。
  2. 清晰的文法表示:可以将复杂的文法规则拆分为简单的组件,使得文法的结构更加清晰。
  3. 适用于简单语言:对于简单的语法规则和表达式,解释器模式可以有效地提供快速的解析和执行。

3、使用时的注意事项

  1. 性能考虑:解释器模式可能导致性能问题,尤其是在处理复杂文法或大规模数据时,因为每次解析都可能涉及到许多对象的创建。
  2. 复杂度:对于复杂的文法,解释器模式的实现可能会变得非常复杂,导致代码难以维护。
  3. 适用性:对于大型或复杂的语言,可能需要更强大和灵活的解析器,考虑使用其他模式(如组合模式、状态模式)来实现。

解释器模式通过将文法规则和解释逻辑分开,使得程序能够灵活地处理输入表达式,适用于简单语言和表达式的解析。尽管它提供了可扩展性和清晰性,但在复杂语法和性能需求较高的场合,需要谨慎使用。

七、在 Unity 中使用 解释器模式

在 Unity 中实现 解释器模式 的示例,我们可以创建一个简单的计算器,解析和计算数学表达式。这个示例将演示如何使用解释器模式来处理加法和减法操作。

使用解释器模式实现简单计算器

参考类图如下:

1、定义抽象表达式类

首先,我们定义一个抽象的表达式类,所有具体表达式都将继承此类。

public abstract class Expression
{public abstract int Interpret();
}

2、实现具体表达式类

接着,我们实现具体的表达式类,分别表示数字和运算符。

public class NumberExpression : Expression
{private int number;public NumberExpression(int number){this.number = number;}public override int Interpret(){return number;}
}public class AddExpression : Expression
{private Expression left;private Expression right;public AddExpression(Expression left, Expression right){this.left = left;this.right = right;}public override int Interpret(){return left.Interpret() + right.Interpret();}
}public class SubtractExpression : Expression
{private Expression left;private Expression right;public SubtractExpression(Expression left, Expression right){this.left = left;this.right = right;}public override int Interpret(){return left.Interpret() - right.Interpret();}
}

3、创建上下文类

我们可以创建一个上下文类,用于解析输入字符串并构建表达式树。

using System;
using System.Collections.Generic;public class Context
{private string input;public Context(string input){this.input = input;}public List<Expression> Parse(){List<Expression> expressions = new List<Expression>();string[] tokens = input.Split(' ');foreach (string token in tokens){if (int.TryParse(token, out int number)){expressions.Add(new NumberExpression(number));}else if (token == "+"){Expression right = expressions[expressions.Count - 1];expressions.RemoveAt(expressions.Count - 1);Expression left = expressions[expressions.Count - 1];expressions.RemoveAt(expressions.Count - 1);expressions.Add(new AddExpression(left, right));}else if (token == "-"){Expression right = expressions[expressions.Count - 1];expressions.RemoveAt(expressions.Count - 1);Expression left = expressions[expressions.Count - 1];expressions.RemoveAt(expressions.Count - 1);expressions.Add(new SubtractExpression(left, right));}}return expressions;}
}

4、创建游戏管理器

我们创建一个游戏管理器类,用于初始化上下文并执行计算。

using UnityEngine;public class GameManager : MonoBehaviour
{void Start(){string expression = "5 3 + 2 -"; // 表达式表示 (5 + 3) - 2Context context = new Context(expression);List<Expression> expressions = context.Parse();// 计算结果int result = expressions[0].Interpret();Debug.Log($"Result: {result}");}
}

5、在 Unity 中测试
  1. 创建一个空的 GameObject,命名为 GameManager,并附加 GameManager 脚本。
  2. 运行游戏,查看控制台输出的计算结果。
6、示例分析
  • 上下文(Context):负责解析输入字符串并创建表达式树。
  • 表达式(Expression):定义抽象表达式及其具体实现(数字、加法、减法)。
  • 灵活性:通过添加更多的表达式类,我们可以轻松扩展支持其他操作(如乘法、除法等)。

这个示例展示了如何在 Unity 中实现 解释器模式,通过解析字符串输入并构建表达式树,灵活地计算简单数学表达式。这种模式在需要解析和执行特定语法时非常有用。

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

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

相关文章

记一次sql查询优化

记一次sql查询优化 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 今天测试环境发现一个问题&#xff0c;就是测试同事在测试的时候&#xff0c;发现cpu一直居高不下&#xff0c;然…

SDK(2 note)

复习上一次内容&#xff1a; 把前一次笔记中的代码&#xff0c;简写一下 #include <windows.h> #include<tchar.h> #include <stdio.h> #include <strsafe.h> VOID showerrormassage() {LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFF…

【春秋云境】CVE-2024-23897-Jenkins 2.441之前版本存在任意文件读取漏洞

一、靶场介绍 Jenkins 2.441及更早版本&#xff0c;以及LTS 2.426.2及更早版本没有禁用其CLI命令解析器的一个功能&#xff0c;该功能会将参数中’字符后跟的文件路径替换为该文件的内容&#xff0c;允许未经身份验证的攻击者读取Jenkins控制器文件系统上的任意文件。 二、P…

SSM+Vue共享单车管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

js中Fucntion的意义

在js中&#xff0c;我们常常如下方式写函数&#xff1a; function fn(){console.log("这是一个函数."); }; fn(); 在js中&#xff0c;函数本质就是一个对象。 那么&#xff0c;结合我的上一篇文章&#xff1a;通俗讲解javascript的实例对象、原型对象和构造函数以及…

谷歌浏览器如何更改下载文件存放的方式及其路径?

1、点击谷歌浏览器右上角的【三个点】 2、选择【设置】&#xff0c;再选择【下载内容】 3、打开【下载完成后显示下载内容】开关&#xff0c; 则&#xff1a;下载网页上的东西之后&#xff0c;会显示在【谷歌浏览器】的右侧&#xff0c;并显示具体下载文件在右侧&#xff1a;…

探索OpenAI的全新里程碑:o1模型

近期&#xff0c;人工智能领域迎来了一项重要突破——OpenAI发布了其最新的语言模型o1。作为一款专为解决复杂问题设计的新一代大语言模型&#xff08;LLM&#xff09;&#xff0c;o1标志着该公司在智能推理能力方面迈出了重要的一步。尽管这个新系统仍处于初步阶段&#xff0c…

系统架构师-面向服务架构(SOA)全解

1、为什么需要SOA架构 1.1 系统集成问题 异构系统整合 例如&#xff0c;一个企业可能同时拥有用 Java 开发的企业资源规划&#xff08;ERP&#xff09;系统、用 C# 开发的客户关系管理&#xff08;CRM&#xff09;系统以及用 Python 开发的数据分析系统。通过 SOA&#xff0…

WebRTC中的维纳滤波器实现详解:基于决策导向的SNR估计

目录 1. 维纳滤波器的基本原理2. WebRTC中的维纳滤波器实现3. 代码逐步剖析4. 总结 在WebRTC的噪声抑制模块中&#xff0c;维纳滤波器&#xff08;Wiener Filter&#xff09;是一种非常常见且重要的滤波器&#xff0c;用于提高语音信号的清晰度并抑制背景噪声。本文将详细解释维…

Flask学习之项目搭建

一、项目基本结构 1、 exts.py 存在的目的&#xff1a;在Python中&#xff0c;如果两个或更多模块(文件)相互导入对方&#xff0c;就会形成导入循环。例如&#xff0c;模块A导入了模块B&#xff0c;同时模块B又导入了模块A&#xff0c;这就会导致导入循环。 比如在这个项目中…

【第二十章:Sentosa_DSML社区版-机器学习之自动建模】

目录 20.1 自动回归 20.2 自动分类 20.3 自动聚类 20.4 AutoARIMA 20.5 自动数据准备 【第二十章&#xff1a;Sentosa_DSML社区版-机器学习之自动建模】 20.1 自动回归 1.算子介绍 为了方便用户在不了解每个具体回归算法原理&#xff0c;及每个算法参数设置具体含义的情…

Threejs绘制圆锥体

上一章节实现了胶囊体的绘制&#xff0c;这节来绘制圆锥体&#xff0c;圆锥体就是三角形旋转获得的&#xff0c;如上文一样&#xff0c;先要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&#xff0c;灯光&#xff0c;渲染器。代码如下&#xff1a; initScene() {this…

[Linux]从零开始的Minecraft服务器搭建教程

一、前言 学习Linux有一段时间了&#xff0c;当然&#xff0c;我们要把学习的知识运用到实际生活中去。最近朋友们都在玩我的世界&#xff0c;网易版的我的世界联机非常不稳定&#xff0c;用起来也算是非常难受了。所以还是准备转战JAVA版。为了联机&#xff0c;可以考虑一个人…

HBase DDL操作代码汇总(namespace+table CRUD操作)

HBase DDL操作 DDL操作主要是关于命名空间和表格的内容增删改查。 注&#xff1a;如果出现无法连接到zookeeper等的相关错误&#xff0c;可以将以下代码打jar包&#xff0c;在HMaster节点上执行 错误提示&#xff1a; Exception in thread “main” java.net.SocketTimeoutExc…

DVWA 靶场环境搭建

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/15 09:30 什么是DVWA: 是OWSASP官方编写的PHP网站&#xff0c;包含了各种网站常见漏洞&#xff08;漏洞靶场&#xff09;&#xff0c;可以学习攻击及修复方式。 PHP环境包含了&#xff0c;Windows/Apache/Mysql/Php g…

公安局软件管理平台建设方案和必要性,论文-2-———未来之窗行业应用跨平台架构

一、平台方略 随着gov信息化建设的不断推进&#xff0c;各类ZW软件的应用需求日益增加。为了提高ZW软件的获取便利性、AQ性和规范性&#xff0c;建设一个专门的GOV软件管理平台具有重要意义。 集中提供各类ZW软件&#xff0c;方便工作人员快速获取和安装&#xff0c;减少因软…

开放原子开源基金会OPENATOM

AtomGit_开放原子开源基金会代码托管平台-AtomGit 开放原子开源基金会是致力于推动全球开源事业发展的非营利机构&#xff0c;于 2020 年 6 月在北京成立&#xff0c;由阿里巴巴、百度、华为、浪潮、360、腾讯、招商银行等多家龙头科技企业联合发起。 精选项目&#xff1a; 比…

IDEA:如何设置项目启动的JVM运行内存大小

IDEA版本不一样页面也不一样 -Xms20m -Xmx200m 其实在本地开发调试的时候不需要太大内存&#xff0c;如果测试性能建议放到运算服务器上面去跑~~~

Python 递归函数如何工作?如何防止递归调用过深导致栈溢出

递归是编程中的一个重要概念&#xff0c;尤其在 Python 中&#xff0c;递归函数可以使某些问题的解决变得更加简洁和优雅。尽管递归具有强大的表达能力&#xff0c;但如果不加以控制&#xff0c;递归调用过深可能会导致栈溢出。本文将深入探讨递归函数的工作原理&#xff0c;如…

android和ios双端应用性能的测试工具

1.工具介绍 基于日常工作的需要&#xff0c;开发了一款新的android和ios端应用性能测试工具&#xff0c;本工具在数据测试方面与所流行的工具没有区别。欢迎下载使用体验。 本工具为筋斗云&#xff0c;工具说明 本工具无侵入&#xff0c;不需要root&#xff0c;低延迟…