軟體設計模式 | 模板模式 : 以Vue.js為例

閱讀時間約 8 分鐘
模板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
raw-image

定義

由父類別制定演算法的執行步驟, 將每個步驟的實作細節延後由子類別實現。

模板模式的定義雖然簡單,但對於初學者來說,往往難以真正體會其背後的概念與優勢。然而,透過經典的應用場景範例,這些概念與優勢就變得清晰易懂。


WEB前端框架生命週期 : VUE.js

在Vue.js編譯完成後,會生成一個包含 "app" id 的 index.html 作為首頁。當開啟網頁時,瀏覽器會將編譯後的整包 JavaScript 掛載到這個 "app" DOM元素上,並建立 Vue應用實例,負責監控網頁與使用者的所有互動以及從網路端獲取的資訊。

應用頁面的生命週期回調函數

當我們導航到客製化開發的應用頁面時,Vue應用實例會將該頁面實例化為Vue組件(component),並依次呼叫該組件的生命週期回調函數。

我們則需要在合適的回調函數內實作業務邏輯。以下是各個生命週期回調函數的實際應用範例:

onBeforeMount

在組件即將被掛載到 DOM 之前呼叫。通常會在這個階段呼叫透端API準備資料。

onBeforeMount(() => {
// 通常在這裡call API準備要顯示的資料
try {
this.data = (await axios.get('/api/data')).data;
} catch (error) {
this.error = error; console.error('Error fetching data:', error); }
});

onMounted

在組件掛載到DOM之後呼叫,這是開發著可以開始訪問和操作DOM元素的地方。適合在這裡進行與DOM相關的初始化操作,例如初始化圖表或設置事件監聽器。

最重要的是,如果在template裡有設定ref,onMounted後就可以開始操作他了。

<template>
<div ref="chartContainer">
這是我的圖表容器
</div>
</template>

<script>
import { onMounted, ref } from 'vue';

export default {
setup() {
const chartContainer = ref(null);

onMounted(() => {
// 操作ref
chartContainer.value.init();

// 有時候想要監聽視窗大小的改變進行畫面上的處理
window.addEventListener('resize', handleResize);
});
},
};
</script>

onBeforeUpdate

在數據更新之前呼叫,此時虛擬DOM(Virtual DOM)已經重新渲染,但新的數據還未應用到真實DOM中。這裡可以進行一些在數據改變後需要在DOM更新前完成的操作。

onBeforeUpdate(() => {
// 可以在這裡進行一些準備工作
console.log("onBeforeUpdate: 數據即將更新");
});

onUpdated

在數據更新並且虛擬DOM重新渲染和差異更新完成之後調用,這時可以進行與更新後DOM相關的操作。

onUpdated(() => { 
// 可以在這裡執行與更新後 DOM 相關的操作
console.log('onUpdated: 數據更新完成,DOM 已重新渲染');
});

onBeforeUnmount

Vue組件被卸載之前調用,通常用於進行一些清理工作,例如移除事件監聽器。

onBeforeUnmount(() => { 
// 移除事件監聽器 window.removeEventListener('resize', handleResize);
console.log('onBeforeUnmount: 組件即將被卸載');
});

onUnmounted

Vue組件被完全卸載並且不再存在於DOM中時調用,可以在這裡進行最終的清理操作,例如銷毀圖表實例。

onUnmounted(() => { 
console.log('onUnmounted: 組件已經從 DOM 中移除');
// 銷毀圖表實例
destroyChart();
});

其他框架的模板設計

Android APP(手機應用框架): Activity生命週期回調函數

onCreate:應用程式第一次開啟時呼叫。例如設定佈局、初始化資料等。

onStart:應用程式即將可見時呼叫。進行界面更新等操作。

onResume:應用程式與使用者互動前的最後準備。例如恢復播放動畫。

onPause:系統即將啟動另一個活動時呼叫。例如暫停播放動畫或音樂。

onStop:應用程式不再可見時呼叫。例如停止播放動畫或音樂、保存應用程式狀態。

onDestroy:應用程式即將被銷毀時呼叫。執行最終清理工作,釋放所有資源。

onRestart:應用程式從停止狀態重新啟動時呼叫。恢復暫停前的操作。

由於手機與使用者的互動即時性比網頁更高,並且涉及了更多系統層級的資源管理,因此Android APP的生命週期更加複雜。開發者需要在合適的回調函數中,更細膩地關注使用者與系統的行為,並處理業務邏輯。


Pytest(Python測試框架) : Test Class回調函數Test Method回調函數

  • setup_class:在整個測試類別開始前呼叫。
  • teardown_class:在整個測試類別結束後呼叫。
  • setup_method:在每個測試案例開始前呼叫。
  • teardown_method:在每個測試案例結束後呼叫。

在撰寫測試腳本時,有一些初始化狀態的前置作業是整個類別共用的,需要在整個類別測試開始時執行一次,並在整個類別測試結束後清理。有些則是每個測試案例開始前執行,測試案例結束後清理。為了方便開發人員在不同的時機撰寫相關的測試邏輯,Pytest 提供了四種回調函數,幫助開發人員根據需求選擇合適的使用時機。


關鍵影響

從實際的應用可以看出,應用框架的設計者使用模板模式預先定義好網頁應用程式、手機應用程式、測試腳本的執行步驟。

使用者可以在這些既定步驟下實作業務需求,但這些步驟的呼叫時機卻是由系統決定。這樣的設計具有以下這些優勢。

一致性:確保整個系統的算法結構和流程一致,避免因個別實現差異而導致的不可預測行為。

靈活性:父類別定義通用流程,子類別可以根據具體需求覆寫部分步驟,使得同一流程可以適應不同的情境和需求。

重用性:父類別中的通用部分可以被多個子類別重用,減少程式碼重複,提高程式碼的可維護性和擴展性。

控制權限:父類別控制流程的執行順序,確保關鍵步驟不會被子類別隨意修改,保障系統的穩定性和安全性。

清晰分工:將算法的固定部分與可變部分分離,使得程式碼結構更加清晰,便於理解和維護。


隱藏的缺點 : 呼叫控制的反轉

雖然模板模式有諸多好處,但這種體現好萊塢原則("Don't call us, we'll call you")的設計反轉了函數的呼叫控制。

這樣的設計卻可能會導致我們開發出許多自己都不知道為什麼能正常運行的程式。

原因在於一些簡單的業務邏輯在各個不同的回調函數下實作時可能不會發生問題,這反而會讓工程師誤以為自己已經完全理解了框架的運作原理。

而其中因為時間緊迫,沒時間完全理解框架設計及規範是最好的情況。

直到BUG實際在客戶手上發生的那一天,工程師們才能真正感受到誤用框架的恐懼。

當你在凝視框架的同時,框架也在凝視著你。

圖片來源: google

圖片來源: google

22會員
14內容數
區塊鏈著名的三角悖論 : 去中心化、可擴展性、安全性三者無法兼得。 這種顧此失彼的困境像極了人生。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
零售讀書會|零售x創業|解構顧客價值鏈:拆解消費者決策流程發現商機切入點,用需求驅動設計新商業模式書名:《解構顧客價值鏈:拆解消費者決策流程,發現商機切入點,用需求驅動設計新商業模式》 本書吸引我的地方是,談到許多零售業遇到的挑戰與現況,也曾經是我所遇到的!​主題談的是顧客價值鏈運,作者舉了非常多零售產業的真實案例,但是往下深入挖掘,在談是商業模式的創新。 ​
Thumbnail
avatar
Lynn
2024-03-24
[設計模式]MVCMVC是一種物件導向設計模式,將應用程式分成Model、View和Controller。是在1979年被提出,主要是要解決下列問題: 維護「長存儲存媒體」(Persistent Storage)的資料 維護執行流程的邏輯控制 顯示使用者所需的資訊和使用介面 Model 實作儲存應用程式
avatar
小黑
2023-12-05
BEM 設計模式與各種使用情境所有的 CSS 設計模式都是為了維持可讀性、好維護、易擴充這幾個目標,今天就來談談 BEM 設計模式,並搭配 Sass 中的 SCSS 來介紹,並探討在各種情境下該如何使用 BEM。
Thumbnail
avatar
傑米
2023-07-14
【💎 資料庫寶典】MongoDB版本控管設計模式MongoDB非常擅長查詢大量的數據並經常更新這些資訊, 在多數的情況之下, 我們只要查詢資訊最新的狀態, 那假設我們需要查詢資料的上一個狀態呢? 如果我們需要一些文檔版本控管功能時怎麼辦呢? 這就是我們可以使用版本控管設計模式的地方了。 這個模式之下會保存文檔的歷史版本, 我們就不用導入另外一個版
Thumbnail
avatar
阿Han
2023-04-23
Fast Endpoints 一個基於 REPR 設計模式的 .NET 輕量高性能 API 框架fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
Thumbnail
avatar
Sponge | 一塊海綿
2023-02-09
玩轉C#之【設計模式-Design Pattern】小心設計模式別亂用 📷 介紹 設計模式就是過去的人,根據常見的軟體設計的問題,提出的解決方案。 設計模式總共有23種,根據情境分成三大類型,建立型、結構型、行為型。 建立型模式(Creational Patterns) 簡單工廠(Simple Factory) 工廠方法(Factory) 抽象工廠
Thumbnail
avatar
一代軍師
2022-10-10
【網路時代的遠距工作模式】設計你的理想生活x佐伊zoey|好書分享#02本月的閱讀清單裡,除了上一本西野亮廣的<不改變就無法生存>外,還有另一本性質有一點類似,但是是從實務角度出發的書,那就是理想生活設計的佐伊。 疫情使然,使許多人是「被迫」開始想辦法把工作全部數位化的。 但,一件事總是一體兩面,在家工作必然的困難點不外乎幾個: 在家裡同時有許多會干擾工作效率的因素:
Thumbnail
avatar
楊筠 Yuna
2022-01-03
活動設計|百元超低成本辦一場20人的密室逃脫這件事情非常突然。 原定要去海水浴場玩,但因天氣直轉冬天+陰雨綿綿,在活動前一天決定取消戶外行程,改成室內活動──於是我們決定在教會辦密室逃脫。be like,在星期六三點活動開始的30小時前。
Thumbnail
avatar
歌詠歡欣
2021-10-24
活動設計|查聖經比賽之密室逃脫脫去一般查經比賽事不關己的觀賽感,讓每個人都能完整體驗到查經、討論的過程,並能全程參與,不會有淘汰而中途離席的情況
Thumbnail
avatar
歌詠歡欣
2021-10-23
課程心得|K大-個人商業模式設計K大怎麼建立自己的飛輪,並且持續利用綜效,創造出巨大效益呢?
Thumbnail
avatar
椪皮仔
2021-01-13