現(xiàn)在的網(wǎng)站越來越復(fù)雜,要實現(xiàn)漂亮的頁面特效和優(yōu)美的用戶交互,離不開一門前端開發(fā)語言——JavaScript。而在JavaScript中,有一種設(shè)計模式叫做三層架構(gòu),將邏輯分成三部分,將業(yè)務(wù)邏輯、數(shù)據(jù)交互和界面渲染分離。這種架構(gòu)在復(fù)雜的應(yīng)用中可以提高代碼的可維護性,降低代碼耦合度,方便代碼的重用和測試,下面我就來詳細介紹一下JavaScript三層架構(gòu)。
1.表示層
表示層負責(zé)為界面渲染提供數(shù)據(jù),這里的界面可以是任何形式,可以是HTML頁面、Web應(yīng)用頁或者桌面應(yīng)用程序等。表示層不關(guān)心具體實現(xiàn)邏輯,只需要了解所需要的數(shù)據(jù)和如何處理數(shù)據(jù)。也就是說表示層只涉及UI和UI相關(guān)邏輯。下面通過一個簡單的案例來說明。
function showBlogList(blogList) {
let str = '';
for (let i = 0; i < blogList.length; i++) {
str +=<li><a href="${blogList[i].url}">${blogList[i].title}</a></li>
;
}
document.querySelector('#blog_list').innerHTML = str;
}
在這個例子中,showBlogList函數(shù)就是表示層的代碼。它根據(jù)傳入的blogList數(shù)組來生成具體的HTML代碼,然后通過innerHTML方法將代碼注入到頁面的某個元素中,這樣就完成了界面渲染的工作。
2.邏輯層
邏輯層是指處理業(yè)務(wù)邏輯的代碼,與表示層相互獨立,不直接操作表示層。邏輯層接受來自表示層的數(shù)據(jù),然后處理數(shù)據(jù)并根據(jù)結(jié)果生成返回值。邏輯層分為業(yè)務(wù)邏輯層和數(shù)據(jù)處理層。下面還是通過一個案例來說明邏輯層的作用。
function getBlogList(user) { const blogList = user.blogs; blogList.sort((a, b) => b.published - a.published); return blogList; }
這個例子中的getBlogList函數(shù)就是邏輯層的代碼。它接收一個user對象作為參數(shù),然后從user對象中拿到博客數(shù)組,排序后返回。在這個例子中,排序可以看做是業(yè)務(wù)邏輯,數(shù)據(jù)的提取則可以看做是數(shù)據(jù)處理。邏輯層的代碼可以被多個表示層調(diào)用,而不需要考慮如何處理數(shù)據(jù)。
3.數(shù)據(jù)層
數(shù)據(jù)層負責(zé)與服務(wù)器和數(shù)據(jù)庫交互,根據(jù)邏輯層的要求,提供數(shù)據(jù)接口。數(shù)據(jù)層需要為邏輯層提供可靠的數(shù)據(jù)來源,數(shù)據(jù)的獲取和存儲都在這個層次完成。下面是一個數(shù)據(jù)層的例子。
function getUser(id) {
return fetch(api/user/${id}
).then(response => response.json());
}
這個例子中g(shù)etUser函數(shù)就是數(shù)據(jù)層的代碼。它根據(jù)用戶的id向服務(wù)器請求用戶數(shù)據(jù),然后將返回的數(shù)據(jù)解析成JSON格式返回。數(shù)據(jù)層的代碼只與數(shù)據(jù)的獲取和存儲相關(guān),不會涉及數(shù)據(jù)的處理和UI渲染。
總結(jié)
JavaScript三層架構(gòu)將邏輯分離,使得代碼更加易于維護和開發(fā)。表示層只負責(zé)UI渲染,邏輯層只負責(zé)處理業(yè)務(wù)邏輯,數(shù)據(jù)層只負責(zé)數(shù)據(jù)的獲取和存儲。通過三層架構(gòu),可以使得代碼組織更加清晰,且各層之間的解耦合度也相對較高,便于單元測試和復(fù)用。