提升開發思維的設計模式(下)

上期回顧

提升開發思維的設計模式(上)

2. 設計模式分類(23種設計模式)

2.13 組合模式(Composite Pattern)

  • 將對象組合成樹形結構,以表示“整體-部分”的層次結構。

  • 通過對象的多態表現,使得用戶對單個對象和組合對象的使用具有一致性。

class TrainOrder {create () {console.log('創建火車票訂單')}
}
class HotelOrder {create () {console.log('創建酒店訂單')}
}class TotalOrder {constructor () {this.orderList = []}addOrder (order) {this.orderList.push(order)return this}create () {this.orderList.forEach(item => {item.create()})return this}
}
// 可以在購票網站買車票同時也訂房間
let train = new TrainOrder()
let hotel = new HotelOrder()
let total = new TotalOrder()
total.addOrder(train).addOrder(hotel).create()

場景

  • 表示對象-整體層次結構

  • 希望用戶忽略組合對象和單個對象的不同,用戶將統一地使用組合結構中的所有對象(方法)

缺點

如果通過組合模式創建了太多的對象,那么這些對象可能會讓系統負擔不起。


2.14 原型模式(Prototype Pattern)

原型模式(prototype)是指用原型實例指向創建對象的種類,并且通過拷貝這些原型創建新的對象。

class Person {constructor(name) {this.name = name}getName() {return this.name}
}
class Student extends Person {constructor(name) {super(name)}sayHello() {console.log(`Hello, My name is ${this.name}`)}
}let student = new Student("xiaoming")
student.sayHello()

原型模式,就是創建一個共享的原型,通過拷貝這個原型來創建新的類,用于創建重復的對象,帶來性能上的提升。


2.15 策略模式(Strategy Pattern)

定義一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換

<html>
<head><title>策略模式-校驗表單</title><meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body><form id = "registerForm" method="post" action="http://xxxx.com/api/register">用戶名:<input type="text" name="userName">密碼:<input type="text" name="password">手機號碼:<input type="text" name="phoneNumber"><button type="submit">提交</button></form><script type="text/javascript">// 策略對象const strategies = {isNoEmpty: function (value, errorMsg) {if (value === '') {return errorMsg;}},isNoSpace: function (value, errorMsg) {if (value.trim() === '') {return errorMsg;}},minLength: function (value, length, errorMsg) {if (value.trim().length < length) {return errorMsg;}},maxLength: function (value, length, errorMsg) {if (value.length > length) {return errorMsg;}},isMobile: function (value, errorMsg) {if (!/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|17[7]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test(value)) {return errorMsg;}                }}// 驗證類class Validator {constructor() {this.cache = []}add(dom, rules) {for(let i = 0, rule; rule = rules[i++];) {let strategyAry = rule.strategy.split(':')let errorMsg = rule.errorMsgthis.cache.push(() => {let strategy = strategyAry.shift()strategyAry.unshift(dom.value)strategyAry.push(errorMsg)return strategies[strategy].apply(dom, strategyAry)})}}start() {for(let i = 0, validatorFunc; validatorFunc = this.cache[i++];) {let errorMsg = validatorFunc()if (errorMsg) {return errorMsg}}}}// 調用代碼let registerForm = document.getElementById('registerForm')let validataFunc = function() {let validator = new Validator()validator.add(registerForm.userName, [{strategy: 'isNoEmpty',errorMsg: '用戶名不可為空'}, {strategy: 'isNoSpace',errorMsg: '不允許以空白字符命名'}, {strategy: 'minLength:2',errorMsg: '用戶名長度不能小于2位'}])validator.add(registerForm.password, [ {strategy: 'minLength:6',errorMsg: '密碼長度不能小于6位'}])validator.add(registerForm.phoneNumber, [{strategy: 'isMobile',errorMsg: '請輸入正確的手機號碼格式'}])return validator.start()}registerForm.onsubmit = function() {let errorMsg = validataFunc()if (errorMsg) {alert(errorMsg)return false}}</script>
</body>
</html>

場景例子

  • 如果在一個系統里面有許多類,它們之間的區別僅在于它們的'行為',那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。

  • 一個系統需要動態地在幾種算法中選擇一種。

  • 表單驗證

優點

  • 利用組合、委托、多態等技術和思想,可以有效的避免多重條件選擇語句

  • 提供了對開放-封閉原則的完美支持,將算法封裝在獨立的strategy中,使得它們易于切換,理解,易于擴展

  • 利用組合和委托來讓Context擁有執行算法的能力,這也是繼承的一種更輕便的代替方案

缺點

  • 會在程序中增加許多策略類或者策略對象

  • 要使用策略模式,必須了解所有的strategy,必須了解各個strategy之間的不同點,這樣才能選擇一個合適的strategy


2.16 享元模式(Flyweight Pattern)

運用共享技術有效地支持大量細粒度對象的復用。系統只使用少量的對象,而這些對象都很相似,狀態變化很小,可以實現對象的多次復用。由于享元模式要求能夠共享的對象必須是細粒度對象,因此它又稱為輕量級模式,它是一種對象結構型模式

let examCarNum = 0         // 駕考車總數
/* 駕考車對象 */
class ExamCar {constructor(carType) {examCarNum++this.carId = examCarNumthis.carType = carType ? '手動檔' : '自動檔'this.usingState = false    // 是否正在使用}/* 在本車上考試 */examine(candidateId) {return new Promise((resolve => {this.usingState = trueconsole.log(`考生- ${ candidateId } 開始在${ this.carType }駕考車- ${ this.carId } 上考試`)setTimeout(() => {this.usingState = falseconsole.log(`%c考生- ${ candidateId } 在${ this.carType }駕考車- ${ this.carId } 上考試完畢`, 'color:#f40')resolve()                       // 0~2秒后考試完畢}, Math.random() * 2000)}))}
}/* 手動檔汽車對象池 */
ManualExamCarPool = {_pool: [],                  // 駕考車對象池_candidateQueue: [],        // 考生隊列/* 注冊考生 ID 列表 */registCandidates(candidateList) {candidateList.forEach(candidateId => this.registCandidate(candidateId))},/* 注冊手動檔考生 */registCandidate(candidateId) {const examCar = this.getManualExamCar()    // 找一個未被占用的手動檔駕考車if (examCar) {examCar.examine(candidateId)           // 開始考試,考完了讓隊列中的下一個考生開始考試.then(() => {const nextCandidateId = this._candidateQueue.length && this._candidateQueue.shift()nextCandidateId && this.registCandidate(nextCandidateId)})} else this._candidateQueue.push(candidateId)},/* 注冊手動檔車 */initManualExamCar(manualExamCarNum) {for (let i = 1; i <= manualExamCarNum; i++) {this._pool.push(new ExamCar(true))}},/* 獲取狀態為未被占用的手動檔車 */getManualExamCar() {return this._pool.find(car => !car.usingState)}
}ManualExamCarPool.initManualExamCar(3)          // 一共有3個駕考車
ManualExamCarPool.registCandidates([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])  // 10個考生來考試

場景例子

  • 文件上傳需要創建多個文件實例的時候

  • 如果一個應用程序使用了大量的對象,而這些大量的對象造成了很大的存儲開銷時就應該考慮使用享元模式

優點

  • 大大減少對象的創建,降低系統的內存,使效率提高。

缺點

  • 提高了系統的復雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質, 不應該隨著內部狀態的變化而變化,否則會造成系統的混亂


2.17 模板方法模式(Template Method Pattern)

模板方法模式由兩部分結構組成,第一部分是抽象父類,第二部分是具體的實現子類。通常在抽象父類中封裝了子類的算法框架,包括實現一些公共方法和封裝子類中所有方法的執行順序。子類通過繼承這個抽象類,也繼承了整個算法結構,并且可以選擇重寫父類的方法。

class Beverage {constructor({brewDrink, addCondiment}) {this.brewDrink = brewDrinkthis.addCondiment = addCondiment}/* 燒開水,共用方法 */boilWater() { console.log('水已經煮沸=== 共用') }/* 倒杯子里,共用方法 */pourCup() { console.log('倒進杯子里===共用') }/* 模板方法 */init() {this.boilWater()this.brewDrink()this.pourCup()this.addCondiment()}
}
/* 咖啡 */
const coffee = new Beverage({/* 沖泡咖啡,覆蓋抽象方法 */brewDrink: function() { console.log('沖泡咖啡') },/* 加調味品,覆蓋抽象方法 */addCondiment: function() { console.log('加點奶和糖') }
})
coffee.init() 

場景例子

  • 一次性實現一個算法的不變的部分,并將可變的行為留給子類來實現

  • 子類中公共的行為應被提取出來并集中到一個公共父類中的避免代碼重復

優點

  • 提取了公共代碼部分,易于維護

缺點

  • 增加了系統復雜度,主要是增加了的抽象類和類間聯系


2.18 責任鏈模式(Chain of Responsibility)

使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系,將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止

// 請假審批,需要組長審批、經理審批、總監審批
class Action {constructor(name) {this.name = namethis.nextAction = null}setNextAction(action) {this.nextAction = action}handle() {console.log( `${this.name} 審批`)if (this.nextAction != null) {this.nextAction.handle()}}
}let a1 = new Action("組長")
let a2 = new Action("經理")
let a3 = new Action("總監")
a1.setNextAction(a2)
a2.setNextAction(a3)
a1.handle()

場景例子

  • JS 中的事件冒泡

  • 作用域鏈

  • 原型鏈

優點

  • 降低耦合度。它將請求的發送者和接收者解耦。

  • 簡化了對象。使得對象不需要知道鏈的結構

  • 增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任

  • 增加新的請求處理類很方便。

缺點

  • 不能保證某個請求一定會被鏈中的節點處理,這種情況可以在鏈尾增加一個保底的接受者節點來處理這種即將離開鏈尾的請求。

  • 使程序中多了很多節點對象,可能再一次請求的過程中,大部分的節點并沒有起到實質性的作用。他們的作用僅僅是讓請求傳遞下去,從性能當面考慮,要避免過長的職責鏈到來的性能損耗。


2.19 命令模式(Command)

將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日志,可以提供命令的撤銷和恢復功能。

// 接收者類
class Receiver {execute() {console.log('接收者執行請求')}}// 命令者
class Command {  constructor(receiver) {this.receiver = receiver}execute () {    console.log('命令');this.receiver.execute()}
}
// 觸發者
class Invoker {   constructor(command) {this.command = command}invoke() {   console.log('開始')this.command.execute()}
}// 倉庫
const warehouse = new Receiver();   
// 訂單    
const order = new Command(warehouse);  
// 客戶
const client = new Invoker(order);      
client.invoke()

優點

  • 對命令進行封裝,使命令易于擴展和修改

  • 命令發出者和接受者解耦,使發出者不需要知道命令的具體執行過程即可執行

缺點

  • 使用命令模式可能會導致某些系統有過多的具體命令類。


2.20 備忘錄模式(Memento)

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到保存的狀態。

//備忘類
class Memento{constructor(content){this.content = content}getContent(){return this.content}
}
// 備忘列表
class CareTaker {constructor(){this.list = []}add(memento){this.list.push(memento)}get(index){return this.list[index]}
}
// 編輯器
class Editor {constructor(){this.content = null}setContent(content){this.content = content}getContent(){return this.content}saveContentToMemento(){return new Memento(this.content)}getContentFromMemento(memento){this.content = memento.getContent()}
}//測試代碼let editor = new Editor()
let careTaker = new CareTaker()editor.setContent('111')
editor.setContent('222')
careTaker.add(editor.saveContentToMemento())
editor.setContent('333')
careTaker.add(editor.saveContentToMemento())
editor.setContent('444')console.log(editor.getContent()) //444
editor.getContentFromMemento(careTaker.get(1))
console.log(editor.getContent()) //333editor.getContentFromMemento(careTaker.get(0))
console.log(editor.getContent()) //222

場景例子

  • 分頁控件

  • 撤銷組件

優點

  • 給用戶提供了一種可以恢復狀態的機制,可以使用戶能夠比較方便地回到某個歷史的狀態

缺點

  • 消耗資源。如果類的成員變量過多,勢必會占用比較大的資源,而且每一次保存都會消耗一定的內存。


2.21 中介者模式(Mediator)

解除對象與對象之間的緊耦合關系。增加一個中介者對象后,所有的 相關對象都通過中介者對象來通信,而不是互相引用,所以當一個對象發生改變時,只需要通知 中介者對象即可。中介者使各對象之間耦合松散,而且可以獨立地改變它們之間的交互。中介者 模式使網狀的多對多關系變成了相對簡單的一對多關系(類似于觀察者模式,但是單向的,由中介者統一管理。)

class A {constructor() {this.number = 0}setNumber(num, m) {this.number = numif (m) {m.setB()}}
}
class B {constructor() {this.number = 0}setNumber(num, m) {this.number = numif (m) {m.setA()}}
}
class Mediator {constructor(a, b) {this.a = athis.b = b}setA() {let number = this.b.numberthis.a.setNumber(number * 10)}setB() {let number = this.a.numberthis.b.setNumber(number / 10)}
}let a = new A()
let b = new B()
let m = new Mediator(a, b)
a.setNumber(10, m)
console.log(a.number, b.number)
b.setNumber(10, m)
console.log(a.number, b.number)

場景例子

  • 系統中對象之間存在比較復雜的引用關系,導致它們之間的依賴關系結構混亂而且難以復用該對象

  • 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。

優點

  • 使各對象之間耦合松散,而且可以獨立地改變它們之間的交互

  • 中介者和對象一對多的關系取代了對象之間的網狀多對多的關系

  • 如果對象之間的復雜耦合度導致維護很困難,而且耦合度隨項目變化增速很快,就需要中介者重構代碼

缺點

  • 系統中會新增一個中介者對象,因 為對象之間交互的復雜性,轉移成了中介者對象的復雜性,使得中介者對象經常是巨大的。中介 者對象自身往往就是一個難以維護的對象。


2.22 解釋器模式(Interpreter)

給定一個語言, 定義它的文法的一種表示,并定義一個解釋器, 該解釋器使用該表示來解釋語言中的句子。

class Context {constructor() {this._list = []; // 存放 終結符表達式this._sum = 0; // 存放 非終結符表達式(運算結果)}get sum() {return this._sum;}set sum(newValue) {this._sum = newValue;}add(expression) {this._list.push(expression);}get list() {return [...this._list];}}class PlusExpression {interpret(context) {if (!(context instanceof Context)) {throw new Error("TypeError");}context.sum = ++context.sum;}}class MinusExpression {interpret(context) {if (!(context instanceof Context)) {throw new Error("TypeError");}context.sum = --context.sum;}}/** 以下是測試代碼 **/const context = new Context();// 依次添加: 加法 | 加法 | 減法 表達式context.add(new PlusExpression());context.add(new PlusExpression());context.add(new MinusExpression());// 依次執行: 加法 | 加法 | 減法 表達式context.list.forEach(expression => expression.interpret(context));console.log(context.sum);

優點

  • 易于改變和擴展文法。

  • 由于在解釋器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴展文法

缺點

  • 執行效率較低,在解釋器模式中使用了大量的循環和遞歸調用,因此在解釋較為復雜的句子時其速度慢

  • 對于復雜的文法比較難維護


2.23 訪問者模式(Visitor)

表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

// 訪問者  
class Visitor {constructor() {}visitConcreteElement(ConcreteElement) {ConcreteElement.operation()}
}
// 元素類  
class ConcreteElement{constructor() {}operation() {console.log("ConcreteElement.operation invoked");  }accept(visitor) {visitor.visitConcreteElement(this)}
}
// client
let visitor = new Visitor()
let element = new ConcreteElement()
element.accept(visitor)

場景例子

  • 對象結構中對象對應的類很少改變,但經常需要在此對象結構上定義新的操作

  • 需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而需要避免讓這些操作"污染"這些對象的類,也不希望在增加新操作時修改這些類。

優點

  • 符合單一職責原則

  • 優秀的擴展性

  • 靈活性

缺點

  • 具體元素對訪問者公布細節,違反了迪米特原則

  • 違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。

  • 具體元素變更比較困難

3. 總結

設計模式是為了可復用、可拓展、高性能軟件,前人給我們總結的寶貴經驗。

設計模式(Design Pattern)是前輩們對代碼開發經驗的總結,是解決特定問題的一系列套路。它不是語法規定,而是一套用來提高代碼可復用性、可維護性、可讀性、穩健性以及安全性的解決方案。

當然,軟件設計模式只是一個引導,在實際的軟件開發中,必須根據具體的需求來選擇。

4. 團隊介紹

三翼鳥數字化技術平臺-ToC服務平臺」以用戶行為數據為基礎,利用推薦引擎為用戶提供“千人千面”的個性化推薦服務,改善用戶體驗,持續提升核心業務指標。通過構建高效、智能的線上運營系統,全面整合數據資產,實現數據分析-人群圈選-用戶觸達-后效分析-策略優化的運營閉環,并提供可視化報表,一站式操作提升數字化運營效率。

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

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

相關文章

h5學習筆記:前端打包

這2天做了一個實驗。在非module傳統的網頁&#xff0c;要實現改名和避免緩存。原本這個事情早在幾年前就做過借助gulp的方式或者fis3 的工具來完成。然而隨著nodejs 來到了24版本后&#xff0c;似乎nodejs的版本這事情就變動復雜多變了。 為什么那么麻煩&#xff1f;實際上開發…

14.OCR字符識別

目錄 1. 識別方法 1. OCR識別 2. OCR識別方法1-助手識別 3. OCR識別方法2-算子分割識別 4.文本分割識別 2. 文本分割 1. 借用助手設置參數文本分割+混合識別 2. 借用助手設置參數文本分割場景2 3.不同字符場景 1.傾斜字符 1. 識別方法 1. OCR識別 *OCR *1. 概念 * …

如果將Word里每頁的行數設置成50行

https://www.zhihu.com/question/357856175 本文來自知乎林聽晴 第一步&#xff1a;新建一個Word文檔 打開“頁面布局”&#xff0c;之后點擊圖片圈起來的小圖標&#xff0c;即可出現“頁面設置”頁面。 ? ? 路徑&#xff1a;頁面設置—文檔網絡&#xff0c;可以看到默認行…

WebRTC(十一):RTCP和SRTCP

RTCP 基本概念 RTCP 是 RTP 的控制協議&#xff0c;用于監控媒體傳輸質量和參與者狀態&#xff0c;并與 RTP 一起工作。RTP 用于傳輸媒體數據&#xff08;如音視頻&#xff09;&#xff0c;RTCP 則用于傳輸控制信息。 RTCP 通常和 RTP 同時使用&#xff0c;并通過 不同端口&…

將element-plus table背景改成透明色

方法一:全局修改(推薦) /* 全局透明表格樣式 */ .el-table, .el-table__header-wrapper, .el-table__body-wrapper, .el-table__row {background-color: transparent !important; }/* 可選:自定義表頭和斑馬紋行的透明度 */ .el-table__header th {background-color: rgba(…

安全運營中的漏洞管理和相關KPI

漏洞管理一直是企業網絡安全運維中的關鍵環節,但又是安全運維的痛點。不僅要投入大量的人力物力,還無法被其他運維團隊所理解。那么,向領導層和相關團隊反映出當前漏洞管理的現狀和挑戰便是一個急需解決的問題。 通過有效的數據講好故事,發現問題,或許是做好漏洞管理的突破…

機器學習框架(1)

以吳恩達的《機器學習》課程為藍本&#xff0c;整理課程框架&#xff0c;自己學習的簡單記錄。 課程講解很清楚&#xff0c;建議有空可以看看原課程。 01 單變量線性回歸 回歸偏向于連續屬性&#xff0c;分類偏向于離散屬性。 監督學習是給定標簽的學習&#xff1b;而無監督學…

AI Ready數據庫,OceanBase打了一個樣

大數據產業創新服務媒體 ——聚焦數據 改變商業 過去一年&#xff0c;企業對AI的興趣不減。從接入大模型&#xff0c;到部署RAG&#xff08;檢索增強生成&#xff09;系統、探索AI Agent&#xff0c;AI從“新技術”變成了“業務工具”的候選項。但一個技術能否真正落地&#x…

趣味數據結構之——鏈

記得數組嗎&#xff0c;一個蘿卜一個坑的想象。在數組的世界里我們就是第三視角&#xff0c;置身于坑外的。如果我們是二維平面上的生物&#xff0c;那數組就是一維的線&#xff0c;我們可以隨機訪問&#xff0c;增刪查改&#xff0c;也可以一眼看出數組大小。 那么對于鏈來說…

構建低代碼平臺的技術解析

低代碼平臺表單引擎與業務事件設計實踐 低代碼平臺表單引擎與業務事件設計實踐一、什么是低代碼&#xff1f;它能做什么&#xff1f;二、請假系統案例介紹2.1 主要功能2.2 業務流程 三、表單元數據、實例數據與業務事件聯動設計3.1 表單元數據&#xff08;Meta&#xff09;如何…

Hive SQL 快速入門指南

在大數據蓬勃發展的當下&#xff0c;處理海量數據成為企業面臨的關鍵挑戰。Hive SQL 作為一款強大的工具&#xff0c;為我們打開了高效處理大數據的大門。接下來&#xff0c;讓我們一起踏上 Hive SQL 的入門之旅。? 一、Hive SQL 是什么? Hive 是基于 Hadoop 的數據倉庫工具…

國內公司把數據湖做成了數據庫

在做多年的數據倉庫項目&#xff0c;數據湖也在做&#xff0c;但是做完發現&#xff0c;這個不是傳統數據庫里面的ODS嗎&#xff1f; 好多公司做數據湖&#xff0c;就是把數據湖做成了ODS層&#xff08;貼源數據層&#xff09;&#xff0c;難道真的數據湖就是這樣等于ODS嗎&am…

Python 數據分析與可視化 Day 6 - 可視化整合報告實戰

&#x1f3af; 今日目標 整合數據分析與可視化結果生成結構化報告用代碼自動生成完整的圖文分析文檔熟悉 Jupyter Notebook / Markdown 圖表 報告生成流程 &#x1f9e9; 一、項目背景&#xff1a;學生成績分析報告 數據來源&#xff1a;students_cleaned.csv&#xff08;含姓…

服務器、樹莓派/香橙派部署HomeAssistant與小愛音箱聯動

HomeAssistant功能介紹與多平臺部署實戰&#xff1a;CentOS服務器、樹莓派、香橙派部署及小愛音箱聯動控制 一、HomeAssistant簡介 HomeAssistant是一款基于Python開發的開源智能家居自動化平臺&#xff0c;它最大的特點是高度集成和自定義。通過HomeAssistant&#xff0c;用…

內存泄漏系列專題分析之二十四:內存泄漏測試Camera相機進程內存指標分布report概述

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 內存泄漏系列專題分析之二十四:內存泄漏測試Camera相機進程內存指標分布report概述 目錄 一、問題背景 二、:內存泄漏測試Camera相機進程內存指標分布report概述 2.1:Camera領域相機進…

華為堆疊理論及配置

一&#xff0c;堆疊基本概念 1.1交換機角色 主交換機&#xff08;Master&#xff09;&#xff1a;主交換機負責管理整個堆疊。**堆疊系統中只有一臺主交換機。**備交換機&#xff08;Standby&#xff09;&#xff1a;備交換機是主交換機的備份交換機。堆疊系統中只有一臺備交換…

【數字經濟】數據即產品架構在數字經濟時代的應用

數據即產品架構在數字經濟時代的應用 在數字經濟中&#xff0c;數據已成為核心生產要素&#xff0c;“數據即產品”&#xff08;Data-as-a-Product&#xff09;架構通過系統化封裝原始數據&#xff0c;實現其可交易、可交付的產品化價值。以下是其架構設計與應用解析&#xff…

MySQL 中的時間序列數據分析與處理

在互聯網應用和企業業務系統中&#xff0c;特別是現在當下環境電商以及跨境電商火爆的情況下&#xff0c;時間序列數據無處不在&#xff0c;如電商訂單時間、用戶登錄日志、設備監控數據等。MySQL 作為主流數據庫&#xff0c;具備強大的時間序列數據處理能力。本文將結合電商訂…

STM32——MDK5編譯和串口下載程序+啟動模式

一、MDK5編譯 1.1 編譯中間文件 還可通過 .map文件計算程序大小 中間文件 > 下載到開發板中的文件 > .hex 二、串口下載 2.1 前提須知 2.2 串口硬件鏈接&#xff08;M3、M4系列&#xff09; M7無串口下載 PC端需安裝 CH340 USB 虛擬串口驅動&#xff1a;CH340 USB 虛…

HyperWorks仿真案例:拓撲優化與激光增材制造的完美結合挖掘輕量化結構的新潛力

許多技術創新都基于自然界中生物結構的設計。通過不斷進化&#xff0c;大自然在數百萬年間已學會根據各種形狀的功能對形狀進行調整&#xff0c;從而最大程度地提高效率。當工程師設法構建堅固而輕盈的結構時&#xff0c;這些自然界中的示例可以提供重要線索。在目前的研究項目…