軟件分層應該如何分層?

阿修羅君


一般信息系統中最常見的是如下所列的4層:表示層,業務邏輯層,持久層,應用層。

模式介紹:

  • 表示層(也稱為UI層):主要對用戶的請求接受,以及數據的返回,為客戶端提供應用程序的訪問。
  • 應用層(也稱為服務層):服務層的作用就是將表現層與業務邏輯層之間完成解耦。那麼表現層中就不會出現任何的業務代碼,當然這樣帶來的好處也是顯而易見的,就是當我們修改業務層代碼時,我們不需要修改表現層的代碼,

當然如果服務層設計的不好,那麼可能會造成反效果。

  • 業務邏輯層(也稱為領域層):主要是針對具體的問題的操作,也可以理解成對數據層的操作,對數據業務邏輯處理,如果說數據層是積木,那邏輯層就是對這些積木的搭建。無疑是系統架構中體現核心價值的部分。它的關注點

主要集中在業務規則的制定、業務流程的實現等與業務需求有關的系統設計,也即是說它是與系統所應對的領域邏輯有關

  • 數據訪問層(也稱為持久化層):主要是針對非原始數據(數據庫或者文本文件等存放數據的形式)的操作層,而不是指原始數據,也就是說,是對數據庫的操作,而不是數據,具體為業務邏輯層或表示層提供數據服務。

案例分析---SSH的分層:

1、在表示層中,首先通過JSP頁面展示信息

2、在服務交互層中實現交互,負責傳送請求(Request)和接收響應(Response),然後Struts根據配置文件(struts-config.xml)將ActionServlet接收到的Request委派給相應的Action處理,然後action進行對請求處理並轉發給JSP頁面。

3、在業務邏輯層中,管理服務組件的Spring IoC容器負責向Struts2提供具體的Action對象,提供業務模型(Model)組件和該組件的協作對象數據處理(DAO)組件完成業務邏輯,並提供事務處理、緩衝池等容器組件以提升系統性能和保證數據的完整性。

4、在數據訪問層中,則依賴於Hibernate的對象化映射和數據庫交互,處理DAO組件請求的數據,並返回處理結果,給業務邏輯層。

以***重大技術需求為例

如果需求徵集頁面接到了一個添加需求的請求,用戶填完表單並提交,在web.xml配置了Struts2的攔截器,攔截表單提交請求,服務交互層根據Struts2的配置文件去服務交互層層的DemandAction,尋找保存的方法,該方法調用業務邏輯層

的方法demandService.Save(),業務邏輯層的這個方法又繼續調用數據持久層的方法把數據保存到數據庫,調用完畢之後返回save,服務交互層根據返回的結果save由服務交互層調用業務層的顯示需求列表方法,業務層調用數據持久層數

數據庫讀取需求信息,回到表現層顯示需求列表界面。Spring提供的IoC容器,我們可以將對象之間的依賴關係交由Spring進行控制管理服務組件的Spring IoC容器負責向Struts2提供具體的Action對象,提供業務模型(Model)組件和該組件的

協作對象數據處理(DAO)組件完成業務邏輯。

二)微軟推薦的分層式結構一般分為三層,從下至上分別為:數據訪問層、業務邏輯層(又或稱為領域層)、表示層。

  1. 表現層(UI):通俗講就是展現給用戶的界面,用於顯示數據和接收用戶輸入的數據,為用戶提供一種交互式操作的界面。
  2. 業務邏輯層(BLL):針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。對於數據訪問層而言,它是調用者;對於表示層而言,它卻是被調用者。也將業務邏輯層稱為領域層。
  3. 數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增、刪、改、查。如果要加入ORM的元素,那麼就會包括對象和數據表之間的mapping,以及對象實體的持久化。也稱為是持久層。數據訪問層中包含實體層(Model 實體層)

JavaWeb中典型的三層架構是:Jsp+Struts/spring+Hibernate的開發模式

簡單工廠模式與三層架構:

三層在簡單工廠的思想和基礎上,為了達到更好的可複用性,可擴展性,可維護性和靈活性,把簡單工廠的邏輯層進一步的分解,把邏輯層分解為邏輯判斷層和數據訪問層,讓她們彼此直接的耦合度達到最低。不管是簡單工廠還是三層架構,它們

之間的最終目的是解耦,最終的效果是達到“高內聚,低耦合”的效果。三層架構我們並不陌生,它是來源於簡單工廠,但是高於簡單工廠,它把簡單工廠的粒度更加細化了,但是它們最終的目的是達到解耦。

一個餐館的例子,如果從買菜上菜到做菜都是一個人,那個人生病了這個餐館就不能營業了。如果有三個人分別負責招待客人、買菜、做菜,他們三個人有一個人生病的話,另外兩個做簡單的調整是可以營業的。也就是一層發生修改不會影響另外兩層的

工作。招待客人的相當於表示層,只負責招待客人,做菜的相當於業務邏輯層按照表示層給的參數做菜,買菜的相當於數據訪問層,只負責按照廚師給的單子買菜。

三)展示層,業務層,持久層,和數據庫層。

如表1-1,有時候,業務層和持久層會合併成單獨的一個業務層,尤其是持久層的邏輯綁定在業務層的組件當中。因此,有一些小的應用可能只有3層,一些有著更復雜的業務的大應用可能有5層或者更多的分層。與第一個四層不同的是,展示層負責處

理所有的界面展示以及交互邏輯,業務層負責處理請求對應的業務,持久層負責對數據的操作,數據層負責操作數據庫。

案例分析:

(參考https://blog.csdn.net/bboyfeiyu/article/details/45136299#t1

為了演示分層架構是如何工作的,想象一個場景,如表1-4,用戶發出了一個請求要獲得客戶的信息。黑色的箭頭是從數據庫中獲得用戶數據的請求流,紅色箭頭顯示用戶數據的返回流的方向。在這個例子中,用戶信息由客戶數據和訂單數組組成(客戶下的訂單)。

用戶界面只管接受請求以及顯示客戶信息。它不管怎麼得到數據的,或者說得到這些數據要用到哪些數據表。如果用戶界面接到了一個查詢客戶信息的請求,它就會轉發這個請求給用戶委託(Customer Delegate)模塊。這個模塊能找到業務層裡對應的模塊處理

對應數據(約束關係)。業務層裡的customer object聚合了業務請求需要的所有信息(在這個例子裡獲取客戶信息)。這個模塊調用持久層中的 customer dao 來得到客戶信息,調用order dao來得到訂單信息。這些模塊會執行SQL語句,然後返回相應的數據給業務層。當 customer object收到數據以後,它就會聚合這些數據然後傳遞給 customer delegate,然後傳遞這些數據到customer screen 展示在用戶面前。

三 分層模式的特點使用場景:

  • 一般的桌面應用程序
  • 電子商務Web應用程

模式特點

  • 每個模塊必須屬於某個層次,為上層提供服務;同時委派任務給下層模塊。
  • 任何一個模塊,都不能逆層次調用;屬於下層的模塊,不得調用(耦合)上層或上層次的模塊。任何一個模塊,都不得跨層次調用。

設計模式實現:

  門面模式 ——我們對於每個模塊或者每個層次都會設計一個“門面”來降低耦合的複雜程度。

  策略模式——抽象層次會隱藏底層的實現細節,這就是策略模式最基本的設計,我們往往會把上層作為功能接口,下層作為可選的策略來實現。

優點

1、開發人員可以只關注整個結構中的其中某一層;

2、可以很容易的用新的實現來替換原有層次的實現;

3、可以降低層與層之間的依賴;

4、有利於標準化;

5、利於各層邏輯的複用。

6、結構更加的明確

7、在後期維護的時候,極大地降低了維護成本和維護時間

缺點

1、降低了系統的性能。這是不言而喻的。如果不採用分層式結構,很多業務可以直接造訪數據庫,以此獲取相應的數據,如今卻必須通過中間層來完成。

2、有時會導致級聯的修改。這種修改尤其體現在自上而下的方向。如果在表示層中需要增加一個功能,為保證其設計符合分層式結構,可能需要在相應的業務邏輯層和數據訪問層中都增加相應的代碼。

3、增加了開發成本。


隔壁科技吳志鵬


一、  軟件架構和分層設計

(一)  軟件架構(software architecture)

      是一系列相關的抽象模式,用於指導大型軟件系統各個方面的設計。軟件架構是一個系統的草圖。軟件架構描述的對象是直接構成系統的抽象組件。各個組件之間的連接則明確和相對細緻地描述組件之間的通訊。在實現階段,這些抽象組件被細化為實際的組件,比如具體某個類或者對象。在面向對象領域中,組件之間的連接通常用接口(計算機科學術語)來實現。 軟件體系結構是構建計算機軟件實踐的基礎。與建築師設定建築項目的設計原則和目標,作為繪圖員畫圖的基礎一樣,一個軟件架構師或者系統架構師陳述軟件構架以作為滿足不同客戶需求的實際系統設計方案的基礎。

(二)分層設計

      分層是表示將功能進行有序的分組:應用程序專用功能位於上層,跨越應用程序領域的功能位於中層,而配置環境專用功能位於低層。分層從邏輯上將子系統劃分成許多集合,而層間關係的形成要遵循一定的規則。通過分層,可以限制子系統間的依賴關係,使系統以更鬆散的方式耦合,從而更易於維護。子系統的分組標準包含以下幾條規則可見度。各子系統只能與同一層及其下一層的子系統存在依賴關係。

(三)使用分層架構開發的必要性

    1、分層設計允許你分割功能進入不同區域。換句話說,層在設計中就是邏輯組件的分組。例如,A層可以訪問B層,但B層不能訪問A 層。

    2、用分層的方法,以提高應用程序的可維護性,並使其更容易擴展,以提高性能。

(四)設計分層的原則

    1、層意味著組建的邏輯分組。例如,對用戶界面,業務邏輯和數據訪問組建應該使用不同的不同的層。

    2、在一個層內組建應該聚合的。如業務層組建僅應提供與業務邏輯相關的操作,而不是提供其他操作。

    3、在設計的每一個層接口時要考慮好物理邊界。如果通信擴展了物理邊界,使用基於消息操作;否則使用基於對象操作。

    4、考慮使用接口類型(interface)來定義每層的接口。這將允許你創建該接口的不同實現,提高可測性。

    5、對於Web應用程序,在表示層和業務邏輯層之間實現基於消息的接口是一個好主意,即使這兩層沒有跨越物理邊界。基於消息的接口更適合於無狀態的Web操作。

二、軟件的三層架構

(一)概述

      在軟件體系架構設計中,分層式結構是最常見,也是最重要的一種結構。微軟推薦的分層式結構一般分為三層,從下至上分別為:數據訪問層、業務邏輯層(又或稱為領域層)、表示層。

1、表示層(UI):通俗講就是展現給用戶的界面,即用戶在使用一個系統的時候他的所見所得。   

2、業務邏輯層(BLL):針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。   

3、數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、查找等。

(二)三層結構原理:   

3個層次中,系統主要功能和業務邏輯都在業務邏輯層進行處理。   

所謂三層體系結構,是在客戶端與數據庫之間加入了一個“中間層”,也叫組件層。這裡所說的三層體系,不是指物理上的三層,不是簡單地放置三臺機器就是三層體系結構,也不僅僅有B/S應用才是三層體系結構,三層是指邏輯上的三層,即使這三個層放置到一臺機器上。三層體系的應用程序將業務規則、數據訪問、合法性校驗等工作放到了中間層進行處理。通常情況下,客戶端不直接與數據庫進行交互,而是通過COM/DCOM通訊與中間層建立連接,再經由中間層與數據庫進行交互。

(三)各層的作用

數據訪問層:

有時候也稱為是持久層,其功能主要是負責數據庫的訪問,可以訪問數據庫系統、二進制文件、文本文檔或是XML文檔。簡單的說法就是實現對數據表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那麼就會包括對象和數據表之間的mapping,以及對象實體的持久化。主要是對原始數據(數據庫或者文本文件等存放數據的形式)的操作層,而不是指原始數據,也就是說,是對數據的操作,而不是數據庫,具體為業務邏輯層或表示層提供數據服務。

業務邏輯層:

主要是針對具體的問題的操作,也可以理解成對數據層的操作,對數據業務邏輯處理,如果說數據層是積木,那邏輯層就是對這些積木的搭建。業務邏輯層(Business Logic Layer)無疑是系統架構中體現核心價值的部分。它的關注點主要集中在業務規則的制定、業務流程的實現等與業務需求有關的系統設計,也即是說它是與系統所應對的領域(Domain)邏輯有關,很多時候,也將業務邏輯層稱為領域層。例如Martin Fowler在《Patternsof Enterprise Application Architecture》一書中,將整個架構分為三個主要的層:表示層、領域層和數據源層。作為領域驅動設計的先驅Eric Evans,對業務邏輯層作了更細緻地劃分,細分為應用層與領域層


分享到:


相關文章: