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

news2024/9/24 11:40:57

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) - 2
        Context 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.coloradmin.cn/o/2160246.html

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

相关文章

java项目之基于springboot的医院资源管理系统源码

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的医院资源管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

计算存款利息-C语言

1.问题&#xff1a; 假设有本金1000元&#xff0c;想存一年&#xff0c;有三种方法可选择&#xff1a; A活期&#xff0c;年利率为0.0036&#xff1b; B一年期定期&#xff0c;年利率为0.0225&#xff1b; C存两次半年定期&#xff0c;年利率为0.0198。 请分别计算出一年后…

Ubuntu的基本用法与指令(为后面学习ROS打基础)

目录 0.声明&#xff1a;此博客的部分内容来自B站up主 机器人工匠阿杰&#xff0c;欢迎大家前往up主视频区学习&#xff08;本人正在跟随此up主的视频学习无人机的部分相关知识&#xff09; 1.win空格&#xff08;切换中英文&#xff09; 2.终端指令 1.ls&#xff1a;显示主…

ATTCK实战系列-Vulnstack三层网络域渗透靶场(一)

ATT&CK实战系列-Vulnstack三层网络域渗透靶场&#xff08;一&#xff09; 一、环境搭建1.1 靶场拓扑图1.2 靶场下载链接1.3 虚拟机配置1.3.1 Windows 7 (web服务器)1.3.2 Windows 2008 (域控)1.3.3 Win2k3 (域内主机) 二、外网打点突破2.1 信息搜集2.2 phpmyadmin 后台 Get…

netfilter和iptables--netfilter源码篇

netfilter和iptables–netfilter源码篇 防火墙是保护服务器和基础设施的重要工具&#xff0c;在Linux系统下&#xff0c;目前广泛使用的防火墙工具是iptables&#xff0c;但实际进行规则实施并产生实际作用的是Netfilter&#xff0c;iptables与内核中的netfilter框架中Hook协同…

❤Node11-登录人token信息接口

❤Node11-登录人token信息接口​ 上一章我们已经从登录部分拿到了用户的登录jwt返回的token信息&#xff0c;接下来我们就通过token来换取用户信息 这里我们可以将其理解为一种加密以及解密的思想来思考这个jwt和token的关系&#xff0c;token就是一个加密的字符串&#xff0c…

【JavaEE】——内存可见性问题

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;内存可见性问题 1&#xff1a;代码解释 2&#xff1a;结果分析 &#xff08;1&#xf…

《现代畜牧兽医》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《现代畜牧兽医》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定 学术期刊。 问&#xff1a;《现代畜牧兽医》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;辽宁省科学技术协会 …

vue2实现提取字符串数字并修改数字样式(正则表达式)

如果你要在循环中提取 item.companyName 中的数字&#xff0c;并且希望为这些数字改变颜色和边距&#xff0c;可以对每个 item 进行处理。此处是一个实现示例&#xff1a; <template> <div> <div class"box" v-for"(item, index) in coldBase…

学校气膜体育馆:低成本、高效率的灵活运动空间—轻空间

在当前教育设施的升级中&#xff0c;传统体育馆的建设往往面临长时间、高成本、以及繁琐的审批流程等诸多挑战。然而&#xff0c;学校无需再为这些问题烦恼&#xff0c;只需选择气膜结构的体育馆&#xff0c;就能快速、高效地解决体育场地需求。气膜体育馆凭借其灵活的设计和高…

Java项目实战II基于SSM的国外摇滚乐队交流和周边售卖系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着互联网技术的飞速发展&#xff0c;信息传播的广度和深度不断拓展&#xff0c;为各行业的创新发展…

二分查找算法(4) _搜索插入位置

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 二分查找算法(4) _搜索插入位置 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

太爱这5本书了,建议所有大模型人去翻烂它❗

要说现在最热门的技术&#xff0c;可谓非大模型莫属&#xff01; 不少小伙伴都想要学习大模型技术&#xff0c;转战AI领域&#xff0c;以适应未来的大趋势&#xff0c;寻求更有前景的发展~~ 然而&#xff0c;在学习大模型技术这条道路上&#xff0c;却不知道如何进行系统的学…

无人机飞手培训校企合作特训技术详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、测绘、救援等多个领域的应用日益广泛&#xff0c;市场对高素质无人机飞手的需求急剧增加。为满足这一需求&#xff0c;促进教育与产业深度融合&#xff0c;无人机飞手培训校企合作模式应运而生。本文将从确定合作目标、共…

可视化大屏看阿里,阿里出品,必属精品。

阿里云有自己的可视化平台——dataV&#xff0c;经常会出一些高颜值、强交互的大屏&#xff0c;本期为大家分享一波。

HTML、CSS

初识web前端 web标准 Web标准也称为网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C (World Wide Web Consortium&#xff0c;万维网联盟) 负责制定。三个组成部分: HTML: 负责网页的结构(页面元素和内容)。CSS: 负责网页的表现(页面元素的外观、位置等页面样…

Tableau|一入门

一 什么是BI工具 BI 工具即商业智能&#xff08;Business Intelligence&#xff09;工具&#xff0c;是一种用于收集、整理、分析和展示企业数据的软件系统&#xff0c;其主要目的是帮助企业用户更好地理解和利用数据&#xff0c;以支持决策制定。 主要功能&#xff1a; 1.数据…

Vue3使用通信组件库mitt作为事件总线实现跨组件通信

mitt 介绍: Mitt 是一个在 Vue.js 应用程序中使用的小型事件总线库。该库允许组件进行通信&#xff0c;而不必过度依赖父级或子级组件之间的 props。 先看项目用例&#xff1a; 【 以下转载自&#xff1a;https://blog.csdn.net/yuanlong12178/article/details/139579299 】…

虚拟机安装xubuntu

新建一个新的虚拟机&#xff0c;选择自定义安装 默认下一步 选择稍后安装操作系统 选择所要创建的系统及版本 填写虚拟机的名称及创建的虚拟机保存的位置 选择处理器和内核的数量 处理器数量指的是&#xff1a;虚拟的CPU数量。 每个处理器的内核数量指的是&#xff1a;虚拟CPU…

Ubuntu 24.04.1 LTS 安装 node 16.20.2环境

目录 step1&#xff1a;确认版本 step2&#xff1a;选择方式 step3&#xff1a;二进制文件安装 step1&#xff1a;确认版本 不同的版本情况可能有稍许不同&#xff0c;尽可能环境安装前版本保持一致&#xff1b; lsb_release -a 或者 cat /etc/os-release 可以查看版本信…