【Unity程序】Unity游戲開發中常用的設計模式【一】

在這里插入圖片描述


👨?💻個人主頁:@元宇宙-秩沅

👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?!

👨?💻 本文由 秩沅 原創

👨?💻 收錄于專欄:Unity基礎實戰

?🅰??



文章目錄

    • ?🅰??
    • ?前言?
    • 🎶(==1==) 常用設計模式
      • 1.單例模式
      • 2.對象池模式
      • 3.享元模式(緩存池)
      • 4.觀察者模式
      • 5.代理模式
      • 6.外觀模式
      • 6.工廠模式
      • 7.命令模式
    • 🎶(==2==) 設計模式Unity模板
      • 1.單例模式
      • 2.對象池模式
      • 3.享元模式(緩存池)
      • 4.觀察者模式(事件中心)
      • 5.代理模式(Mediator中介)
      • 6.外觀模式
    • 🎶(==3==) 程序框架
      • 1. UIManager
      • 2.UIManager中的面板基類BasePanel
    • ?🅰??


?前言?


🎶(1 常用設計模式


1.單例模式


  • 單例模式就像是一個特殊的工廠,它確保一個類只能創建一個對象,就像是工廠只生產一種特定的產品。這種模式有助于確保在整個程序中,某個類的實例只有一個,避免了不必要的資源浪費和數據混亂。

  • 單例模式也可以類比為一個全局的管理員。它確保了在整個應用程序中只有一個實例存在,因此可以用來管理全局狀態、資源、配置等,確保這些全局數據在程序中的一致性和唯一性。


2.對象池模式


  • 是創建型設計模式的一種,將對象預先創建并初始化后放入對象池中,對象提供者就能利用已有的對象來處理請求,減少頻繁創建對象所占用的內存空間和初始化時間。

  • 對象池模式(Object Pool Pattern):重點在于管理可重用對象的集合,以避免頻繁創建和銷毀對象帶來的性能開銷。對象池會預先創建一定數量的對象,并在需要時將它們分配給客戶端,客戶端使用完畢后將對象歸還給池而不是銷毀。這樣可以避免頻繁地創建和銷毀對象,提高了性能和資源利用率。


3.享元模式(緩存池)


享元模式(Flyweight Pattern):主要關注的是共享對象以減少內存占用和提高性能。它通過共享盡可能多的相似對象來減少內存使用,特別是當對象具有大量相似的狀態時。它通常通過將對象的共享狀態(內在狀態)與對象的特定狀態(外在狀態)相分離來實現。


4.觀察者模式


在Unity中,觀察者模式是一種設計模式,用于實現對象之間的一對多依賴關系。它允許一個對象(稱為主題或被觀察者)將其狀態的改變通知給一組依賴于該對象的其他對象(稱為觀察者),使得這些觀察者能夠自動更新。
在Unity中,觀察者模式通常使用事件(Event)來實現。被觀察者對象定義一個事件,并在適當的時候觸發該事件。觀察者對象通過訂閱(Subscribe)這個事件來注冊自己,一旦事件被觸發,觀察者對象會收到通知并執行相應的操作。

觀察者模式在游戲開發中經常使用,例如在實現游戲中的事件系統、UI更新等方面。它提供了一種松耦合的方式,使得對象之間的通信更加靈活和可維護。


5.代理模式


在Unity中,代理模式是一種設計模式,用于通過創建一個代理類來控制對另一個對象的訪問。代理類充當了被代理對象的中介,可以在訪問被代理對象之前或之后執行一些額外的操作。

在游戲開發中,代理模式常用于以下情況:

  1. 遠程代理:在網絡游戲中,代理模式可以用于處理客戶端和服務器之間的通信。客戶端通過代理類與服務器進行通信,代理類負責將請求轉發給服務器并返回響應。
  2. 虛擬代理:當處理大量資源時,可以使用代理模式來延遲創建或加載這些資源。代理類可以在需要時才實例化或加載資源,以提高程序的性能。
  3. 安全代理:代理模式可以用于實現訪問控制。代理類可以根據用戶的權限來控制對某些功能的訪問,從而增強系統的安全性。

在Unity中,代理模式可以通過創建一個繼承自某個接口的代理類來實現。代理類可以與被代理對象實現相同的接口,并在必要時調用被代理對象的方法或屬性。這樣,代理類就可以代替被代理對象與其他對象進行交互。


6.外觀模式


在Unity中,外觀模式是一種設計模式,用于提供一個統一的接口,封裝了一組復雜的接口或子系統,并使其更容易使用。外觀模式的目的是簡化客戶端與接口之間的交互,通過隱藏復雜的實現細節,提供一個簡單的接口給客戶端使用。

  • 在Unity中,外觀模式通常用于簡化復雜的系統或子系統的使用。例如,當使用Unity的物理引擎時,可以使用Rigidbody外觀來處理物體的物理行為。這樣,開發者可以使用簡單的方法,如AddForce和Rotate,來控制物體的運動和旋轉,而不必關心底層的物理計算和碰撞檢測。

  • 另一個常見的使用外觀模式的地方是在游戲開發中的音頻管理中。通過創建一個AudioManager外觀,開發者可以使用簡單的方法,如PlaySound和StopSound,來控制游戲中的音頻播放,而不必直接訪問底層的音頻引擎。

使用外觀模式可以提高代碼的可讀性和可維護性,簡化客戶端代碼,并且使系統更加靈活和可擴展。


6.工廠模式


在Unity中,工廠模式是一種創建型設計模式,用于封裝對象的實例化過程。工廠模式將對象的創建委托給一個工廠類,該工廠類負責根據不同的條件或參數返回適當的對象實例。

  • 工廠模式的主要目的是隱藏對象的創建細節,并提供一種統一的方式來創建對象,使代碼更加靈活和可維護。通過使用工廠模式,可以降低代碼的耦合性,使得代碼的擴展更加容易。

  • 在Unity中,工廠模式常用于創建游戲對象的實例。通過使用工廠模式,可以根據不同的需求和場景,以一種統一的方式來創建游戲對象,并在需要時對其進行初始化和配置。工廠模式可以幫助我們簡化游戲對象的創建過程,提高代碼的可讀性和可維護性。

在Unity中,工廠模式可以通過自定義腳本和組件來實現。通過編寫工廠類,可以根據不同的條件或參數來創建不同類型的游戲對象,并將其添加到場景中或作為其他對象的子對象。同時,還可以通過工廠類的接口來控制對象的創建和初始化過程,以及處理對象的銷毀和回收。


7.命令模式


在Unity中,命令模式是一種設計模式,用于解耦游戲對象的行為和輸入命令之間的關系。該模式通過將命令封裝成對象,使得游戲對象不需要直接處理輸入命令,而是通過調用命令對象來執行相應的操作。

在命令模式中,通常有四個主要的角色:

  1. 命令(Command):定義了需要執行的操作接口,通常包含一個執行方法(Execute)和一個撤銷方法(Undo)。

  2. 具體命令(Concrete Command):實現了命令接口的具體類,包含了具體的操作邏輯。

  3. 命令調用者(Invoker):負責調用具體命令的對象,通常包含一個命令對象的引用。

  4. 接收者(Receiver):真正執行命令的對象,通常是游戲對象或者組件。

在Unity中,可以將輸入命令封裝成具體的命令對象。當玩家觸發某個操作時,比如按下按鈕或者觸摸屏幕,命令調用者會創建相應的命令對象,并調用其執行方法。命令對象會將具體的操作邏輯委托給接收者來執行。
通過使用命令模式,可以實現游戲對象的行為和輸入命令之間的解耦,提高代碼的可維護性和擴展性。


🎶(2 設計模式Unity模板



1.單例模式


  • SingleManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//不繼承Mono的泛型模板
public class SingleManager<T> where T:new()
{private static T instance;public static T GetInstance(){if (instance == null)instance = new T();return instance;}
}
  • SingletonMono
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//繼承了 Mono的泛型模板 --激活只能拖拽或者AddComponent
public class SingletonMono<T> : MonoBehaviour where T: MonoBehaviour
{private static T instance;public static T GetInstance(){       return instance;}protected virtual void Awake(){instance = this as T;}}
  • SingletonAutoMono
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//激活--不需要拖拽或者AddComponent--直接在面板中創建
public class SingletonAutoMono<T> : MonoBehaviour where T : MonoBehaviour
{private static T instance;public static T GetInstance(){if( instance == null ){GameObject obj = new GameObject();obj.name = typeof(T).ToString(); //設置對象的名字為腳本名DontDestroyOnLoad(obj);          //過場景 不移除instance = obj.AddComponent<T>();}return instance;}}

2.對象池模式


//音符塊(棧)聲明private Stack<NoteObject> noteObjectPool = new Stack<NoteObject>();/// <summary>/// 對象池有關/// </summary>/// <returns></returns>public NoteObject GetFreshNoteObject()   // 從對象池中取音符對象{NoteObject retObj;if (noteObjectPool.Count>0){retObj = noteObjectPool.Pop();}else{//資源源//retObj = Instantiate(noteObject);retObj = Instantiate(noteObject);}retObj.transform.position = Vector3.one*2;retObj.gameObject.SetActive(true);//retObj.SetActive(true);retObj.enabled = true;return retObj;}public void ReturnNoteObjectToPool(NoteObject obj)  //將音符對象放入對象池{if (obj!=null){obj.enabled = false;obj.gameObject.SetActive(false);noteObjectPool.Push(obj);}}/// <summary>/// 從特效對象池中取對象/// </summary>/// <param name="stack"></param>/// <param name="effectObject"></param>public GameObject GetFreshEffectObject(Stack<GameObject> stack,GameObject effectObject){GameObject effectGo;if (stack.Count>0){effectGo=stack.Pop();}else{effectGo = Instantiate(effectObject);}effectGo.SetActive(true);  //確保特效對象是激活狀態return effectGo;}

3.享元模式(緩存池)


在這里插入圖片描述

  • PoolManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;// 抽屜數據  public class PoolData
{public GameObject fatherObj;public List<GameObject> poolList;public PoolData(GameObject obj, GameObject poolObj){fatherObj = new GameObject(obj.name);fatherObj.transform.parent = poolObj.transform;poolList = new List<GameObject>() {};PushObj(obj);}//存public void PushObj(GameObject obj){obj.SetActive(false);poolList.Add(obj);obj.transform.parent = fatherObj.transform;}//取public GameObject GetObj(){GameObject obj = null;       obj = poolList[0];     //取第一個poolList.RemoveAt(0);  //然后容器中移除obj.SetActive(true);obj.transform.parent = null;     //斷開了父子關系return obj;}
}//緩存池管理器
public class PoolManager : SingleManager<PoolManager>
{//存儲衣柜public Dictionary<string, PoolData> poolDic = new Dictionary<string, PoolData>();private GameObject poolObj;//衣柜里面拿東西public void GetObj(string name, UnityAction<GameObject> callBack){//有抽屜 并且抽屜里有東西if (poolDic.ContainsKey(name) && poolDic[name].poolList.Count > 0){callBack(poolDic[name].GetObj());}else{//通過異步加載資源 創建對象給外部用ResourceManager .GetInstance().LoadAsync<GameObject>(name, (obj2) =>{obj2.name = name;callBack(obj2); //異步加載出的資源不能直接給外部使用所以需要委托});}}//放東西進衣柜public void PushObj(string name, GameObject obj){if (poolObj == null)  //防止報錯poolObj = new GameObject("Pool");//里面有抽屜if (poolDic.ContainsKey(name)){poolDic[name].PushObj(obj);}else{poolDic.Add(name, new PoolData(obj, poolObj));}}//清空緩存池——在場景切換時public void Clear(){poolDic.Clear();poolObj = null;}
}

4.觀察者模式(事件中心)


在這里插入圖片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;public interface IEventInfo
{}public class EventInfo<T> : IEventInfo
{public UnityAction<T> actions;public EventInfo( UnityAction<T> action){actions += action;}
}public class EventInfo : IEventInfo
{public UnityAction actions;public EventInfo(UnityAction action){actions += action;}
}/// <summary>
/// 事件中心 單例模式對象
/// 1.Dictionary
/// 2.委托
/// 3.觀察者設計模式
/// 4.泛型
/// </summary>
public class EventCenter : BaseManager<EventCenter>
{//key —— 事件的名字(比如:怪物死亡,玩家死亡,通關 等等)//value —— 對應的是 監聽這個事件 對應的委托函數們private Dictionary<string, IEventInfo> eventDic = new Dictionary<string, IEventInfo>();/// <summary>/// 添加事件監聽/// </summary>/// <param name="name">事件的名字</param>/// <param name="action">準備用來處理事件 的委托函數</param>public void AddEventListener<T>(string name, UnityAction<T> action){//有沒有對應的事件監聽//有的情況if( eventDic.ContainsKey(name) ){(eventDic[name] as EventInfo<T>).actions += action;}//沒有的情況else{eventDic.Add(name, new EventInfo<T>( action ));}}/// <summary>/// 監聽不需要參數傳遞的事件/// </summary>/// <param name="name"></param>/// <param name="action"></param>public void AddEventListener(string name, UnityAction action){//有沒有對應的事件監聽//有的情況if (eventDic.ContainsKey(name)){(eventDic[name] as EventInfo).actions += action;}//沒有的情況else{eventDic.Add(name, new EventInfo(action));}}/// <summary>/// 移除對應的事件監聽/// </summary>/// <param name="name">事件的名字</param>/// <param name="action">對應之前添加的委托函數</param>public void RemoveEventListener<T>(string name, UnityAction<T> action){if (eventDic.ContainsKey(name))(eventDic[name] as EventInfo<T>).actions -= action;}/// <summary>/// 移除不需要參數的事件/// </summary>/// <param name="name"></param>/// <param name="action"></param>public void RemoveEventListener(string name, UnityAction action){if (eventDic.ContainsKey(name))(eventDic[name] as EventInfo).actions -= action;}/// <summary>/// 事件觸發/// </summary>/// <param name="name">哪一個名字的事件觸發了</param>public void EventTrigger<T>(string name, T info){//有沒有對應的事件監聽//有的情況if (eventDic.ContainsKey(name)){//eventDic[name]();if((eventDic[name] as EventInfo<T>).actions != null)(eventDic[name] as EventInfo<T>).actions.Invoke(info);//eventDic[name].Invoke(info);}}/// <summary>/// 事件觸發(不需要參數的)/// </summary>/// <param name="name"></param>public void EventTrigger(string name){//有沒有對應的事件監聽//有的情況if (eventDic.ContainsKey(name)){//eventDic[name]();if ((eventDic[name] as EventInfo).actions != null)(eventDic[name] as EventInfo).actions.Invoke();//eventDic[name].Invoke(info);}}/// <summary>/// 清空事件中心/// 主要用在 場景切換時/// </summary>public void Clear(){eventDic.Clear();}
}

5.代理模式(Mediator中介)


在這里插入圖片描述

using PureMVC.Interfaces;
using PureMVC.Patterns.Mediator;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//-------------------------------
//-------功能:  角色面板視圖中介
//-------創建者:         -------
//------------------------------/// <summary>
/// 角色面板視圖中介
/// 固定:
/// 1.繼承PureMVC的Mediator腳本
/// 2.寫構造函數
/// 3.重寫監聽通知的方法
/// 4.重寫處理通知的方法
/// 5.可選:重寫注冊時的方法
/// </summary>
public class RoleViewMediator : Mediator
{//銘牌名public static string NAME = "RoleViewMediator";/// <summary>/// 構造函數/// </summary>public RoleViewMediator( ) : base(NAME){//可以去寫創捷面板預設體的邏輯等}/// <summary>/// 重寫監聽通知的方法,返回需要的監聽(通知)/// </summary>/// <returns>返回你需要監聽的通知的名字數組</returns>public  override string[] ListNotificationInterests(){return new string[] { PureNotification.UPDATA_ROLE_INFO,PureNotification.ROLE_PANEL };}/// <summary>/// 重寫處理通知的方法,處理通知/// </summary>/// <param name="notification">通知</param>public override void HandleNotification(INotification notification){switch (notification.Name){case  PureNotification.UPDATA_ROLE_INFO:(ViewComponent as RoleView).UpdateView(notification.Body as PlayerDataObj); break;}}/// <summary>/// 可選:重寫注冊方法(他們需要到Facde中注冊)/// </summary>public override void OnRegister(){base.OnRegister();}}

6.外觀模式



🎶(3 程序框架


1. UIManager


其中的異步加載方法,緩沖時間很有可能會影響參數的及時傳遞

采用單例模式構造的UIManager腳本,對所有面板類Panel進行管理,在UIManager中

  • ①加載預制體。Canvas和所有面板都以預制體的方式進行異步加載
  • ②構建層級。并構建顯示層級(Bot,Mid,Top,System) ,方便面板之間的顯隱
  • ③提供面板顯示、隱藏、移除和 自定義事件添加的方法

2.UIManager中的面板基類BasePanel


面板基類作為,所需面板的繼承源,為其子類提供了很多便利,如下:

  • ①激活查詢控件。內部構建了找尋面板中所有UI控件的方法,一激活就尋找并將其存儲到字典當中
  • ②精準獲取控件。可通過UI控件名字和類型,來精確得到對應UI控件(在字典中遍歷)

?🅰??


?【Unityc#專題篇】之c#進階篇】

?【Unityc#專題篇】之c#核心篇】

?【Unityc#專題篇】之c#基礎篇】

?【Unity-c#專題篇】之c#入門篇】

?【Unityc#專題篇】—進階章題單實踐練習

?【Unityc#專題篇】—基礎章題單實踐練習

?【Unityc#專題篇】—核心章題單實踐練習


你們的點贊👍 收藏? 留言📝 關注?是我持續創作,輸出優質內容的最大動力!


在這里插入圖片描述


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18443.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18443.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18443.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C語言習題】26.字符逆序

文章目錄 1.描述2.解題思路3.具體代碼 1.描述 輸入描述: 將一個字符串str的內容顛倒過來&#xff0c;并輸出。可以有空格 數據范圍&#xff1a;1≤&#x1d459;&#x1d452;&#x1d45b;(&#x1d460;&#x1d461;&#x1d45f;)≤10000 1≤len(str)≤10000 輸出描述&…

Android基礎-數據庫

在Android系統中&#xff0c;數據庫扮演著至關重要的角色&#xff0c;它負責存儲、管理和檢索應用程序所需的數據。隨著移動應用的日益復雜和功能的不斷增加&#xff0c;對數據庫的需求也日益提高。在Android中&#xff0c;有多種數據庫管理系統和工具可供選擇&#xff0c;其中…

NDIS協議驅動(四)

NDIS 定義對象標識符 (OID) 值&#xff0c;以標識適配器參數&#xff0c;其中包括設備特征、可配置設置和統計信息等操作參數。 協議驅動程序可以查詢或設置基礎驅動程序的操作參數。 NDIS 還為 NDIS 6.1 及更高版本的協議驅動程序提供直接 OID 請求接口。 直接 OID 請求路徑支…

利用EasyCVR視頻智能監控技術,構建智慧化考場監管體系

隨著科技的進步&#xff0c;視頻監控在各個領域的應用越來越廣泛&#xff0c;其中在考場中的應用尤為顯著。視頻監控不僅能夠提高考場的監管水平&#xff0c;確保考試的公平、公正和公開&#xff0c;還能有效預防和打擊作弊行為&#xff0c;為考生營造一個良好的考試環境。 傳…

前后端分離跨域問題解決方案

Vue和SpringBoot的跨域問題的4中解決方案 跨域問題產生的原因&#xff1a;瀏覽器的保護機制&#xff0c;同源策略協議&#xff0c;域名&#xff0c;端口&#xff1b;三個中有一個不同就會產生跨域問題 解決方案&#xff08;后端&#xff09;&#xff1a; 1.CrossOrigin注解&…

界面控件DevExtreme v23.2亮點 - 標簽、表單、編輯器功能升級

DevExtreme擁有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用現代Web開發堆棧&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;構建交互式的Web應用程序。從Angular和Reac&#xff0c…

腦圖工具 在學習系統架構中的使用

系統&#xff0c;有人把它比作一個黑盒&#xff0c;有人比作一個樹洞。呃&#xff0c;其實二者都隱含的表達了一個意思&#xff0c;盤根錯節&#xff0c;一言難盡&#xff0c;欲說還休&#xff0c;說了又像是隔靴搔癢&#xff0c;感覺沒說透。 學習&#xff0c;理解和展示一個…

計算機組成原理----移碼

在網上搜索移碼是什么,大概率會搜到一個結論:移碼是補碼符號位取反,可是真的是這樣嗎? 傳統的有符號整數是將二進制數的首位作為符號位,0表示正數,1表示負數。 但在移碼中,我們不再使用單獨的符號位來表示正負。而是通過一個固定的偏置量來將所有可能的指數值映射到一個無符…

力扣每日一題 5/28

題目&#xff1a;2951-找出峰值 給你一個下標從 0 開始的數組 mountain 。你的任務是找出數組 mountain 中的所有 峰值。 以數組形式返回給定數組中 峰值 的下標&#xff0c;順序不限 。 注意&#xff1a; 峰值 是指一個嚴格大于其相鄰元素的元素。數組的第一個和最后一個元…

C語言.順序表.通訊錄

基于順序表示實現通訊錄 1.通訊錄項目的功能要求2.代碼實現3.頭文件處理4.通訊錄的具體實現4.1通訊錄的初始化與銷毀4.1.1通訊錄的初始化4.1.2通訊錄的初始化銷毀 4.2通訊錄的添加與刪除數據4.2.1通訊錄的添加數據4.2.1通訊錄的刪除數據 4.3通訊錄的修改4.4通訊錄的查找4.5通訊…

熟悉電腦快捷鍵(包含部分VS)

有很多不太電腦的小白&#xff0c;這里給大家一些常用快捷鍵&#xff0c;希望幫助到大家學習~ ctrl c 復制&#xff08;保留原內容&#xff09; ctrl v 粘貼 ctrl x 剪切&#xff08;跟復制不一樣的地方在于原內容清空&#xff09; ctrl z …

【python】OpenCV—Tracking(10.2)

文章目錄 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三種背景分割器 K-Nearest&#xff1a;KNN Mixture of Gaussian&#xff08;MOG2&#xff09; Geometric Multigid&#xff08;GMG&#xff09; …

AURIX TC3xx單片機介紹-啟動過程介紹2

AURIX TC377,TC387,TC397用戶啟動程序流程 用戶啟動程序是在Boot Firmware之后運行的程序(即用戶程序里的第一級Boot Loader,類似Linux的Uboot),初始化過程是CPU0完成的。用戶可以根據不同的復位事件來選擇不同的執行路徑。 AURITX 2代芯片的主要啟動過程如下(該階段只…

WebGL學習(一)渲染關系

學習webgl 開發理解渲染關系是必須的&#xff0c;也非常重要&#xff0c;很多人忽視了這個過程。 我這里先簡單寫一下&#xff0c;后面盡量用通俗易懂的方式&#xff0c;舉例講解。 WebGL&#xff0c;全稱Web Graphics Library&#xff0c;是一種在網頁上渲染3D圖形的技術。它…

C++模板元編程--函數萃取

在C中&#xff0c;std::declval是一個非常有用的模板函數&#xff0c;它是標準庫<utility>頭文件的一部分。它的主要作用是在不創建對象的情況下&#xff0c;獲取該類型的引用&#xff0c;從而允許在編譯時表達式中使用該類型的成員函數或成員變量&#xff0c;即使沒有默…

python中的-1是什么意思

python中的-1是什么意思&#xff1f; -1指的是索引&#xff0c;即列表的最后一個元素。 比如你輸入一個列表&#xff1a; a &#xff1d; [1,2,3,4,5,6,7] a[-1]就代表索引該列表最后一個值&#xff0c;你可以 b a[-1] print(b) 結果如下&#xff1a; 7 索引從左往右是…

P9712 「QFOI R1」貼貼

「QFOI R1」貼貼 題目描述 小 R 是一個可愛的女孩子&#xff0c;她希望通過給洛谷題目寫題解的方式跟出題人貼貼。 她發現&#xff0c;如果從題解界面點擊“提交題解”按鈕&#xff0c;博客中會自動生成 URL 標識符&#xff0c;也就是文章的鏈接。 其中&#xff0c;標識符的…

GB/T 33133.2-2021 《信息安全技術 祖沖之序列密碼算法 第2部分:保密性算法》標準介紹

編寫背景 在數字化時代&#xff0c;信息安全的重要性日益凸顯。為了加強數據傳輸和存儲的安全性&#xff0c;中國國家標準GB/T 33133.2-2021應運而生。這一標準是祖沖之序列密碼算法系列的第二部分&#xff0c;專注于保密性算法&#xff0c;旨在提供一種高效、安全的數據加密解…

升級鴻蒙4.2新變化,新增 WLAN 網絡自動連接開關!

手機已經成為現代人生活中不可或缺的一部分&#xff0c;手機里的功能可以滿足大部分人的生活場景&#xff0c;但是最依賴的應該就是手機網絡&#xff0c;手機網絡突然變差怎么辦——消息發不出去&#xff1f;刷新聞速度變慢&#xff1f;仔細檢查后&#xff0c;發現其實不是手機…

什么是邊緣計算?它為何如此重要?天拓四方

隨著信息技術的快速發展&#xff0c;數據處理和計算的需求日益增大&#xff0c;特別是在實時性要求極高的場景中&#xff0c;傳統的云計算模式面臨著巨大的挑戰。在這樣的背景下&#xff0c;邊緣計算作為一種新興的計算模式&#xff0c;正逐漸受到業界的廣泛關注。那么&#xf…