本文探討以下幾個問題:php
若是你搜索「架構模式和架構風格的區別」,你會發現答案千差萬別:設計模式
我我的的觀點是:架構模式是特定問題域下,架構風格的具體應用!瀏覽器
咱們來一個個的說!架構
在說架構模式以前,咱們先來看看咱們常掛在嘴邊的設計模式是怎麼定義的!app
GOF在《Design Patterns》這本書的「What is a Design Pattern?」小節,對設計模式下了一個明確的定義:ide
The design patterns in this book are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context.
設計模式描述了一組類和對象的關係,用以解決特定上下文內的某個常見的設計問題!微服務
那咱們能夠這麼定義架構模式:架構模式描述了一組組件之間的關係,用以解決特定上下文內的某個常見的架構問題!ui
Wiki上也給架構模式作了相似的定義:this
An architectural pattern is a general, reusable solution to a commonly occurring problem in software architecture within a given context
架構模式是一個通用的、可重用的解決方案,用以解決特定上下文內的某個常見的架構問題!設計
Roy Thomas Fielding博士,在他的REST論文中,對架構風格作出了定義:
An architectural style is a coordinated set of architectural constraints that restricts the roles/features of architectural elements and the allowed relationships among those elements within any architecture that conforms to that style.
一種架構風格是一組協做的架構約束,這些約束限制了架構元素的角色和功能,以及在任何一個遵循該風格的架構中容許存在的元素之間的關係。
Martin Flower在微服務文章中的說明,也間接支持了此定義。文中首先明確「微服務」是一種架構風格,而後給出了微服務所具備的特徵(就是約束),具備這些約束的系統就能夠說是使用了微服務架構風格!
微軟的Azure文檔也給出了相似的定義:架構風格即約束!
上面咱們分別給「架構模式」和「架構風格」下了定義!那麼「架構模式」和「架構風格」到底有什麼區別呢?
咱們來看架構模式的定義,能夠抽出幾個關鍵詞:
咱們再看架構風格的定義,它僅僅就是約束!約束了組件之間的關係!
因此「架構模式」和「架構風格」的區別就在這裏:
若是你仔細看看Wiki中列出的架構風格和架構模式,你就能看出點端倪了!
架構模式 | 架構風格 |
---|---|
Three-Tier Multilayered architecture Model-View-Controller(MVC) Domain Driven Design Micro-Kernel Blackboard Pattern Sensor-Controller-Actuator Presentation–Abstraction–Control |
CQRS Component-based Monolithic application Layered (or multilayered architecture) Pipes and Filters Database-Centric Blackboard Rule-based Event-driven aka implicit invocation Publish-subscribe Asynchronous Messaging Plug-Ins Microkernel Reflection Domain Specific Languages(DSL) Client-Server (2-tier, 3-tier, n-tier exhibit this style) Shared Nothing Architecture Space-based Architecture Object Request Broker Peer-to-Peer Representational State Transfer (REST) Service-Oriented Cloud Computing Patterns MicroServices |
你會發現,架構風格中有「Multilayered」這個架構風格,架構模式裏也有「Multilayered」架構模式!好像分層架構既是架構風格,也是架構模式!實際上架構模式中的「分層架構」是架構風格中的「分層架構」的實際應用。
更具備說服力的是CS架構風格,能夠看到此架構風格後面有個闡述「2-tier, 3-tier, n-tier exhibit this style」,意思是兩層架構、三層架構、n層架構都是CS架構風格的一種表現形式。而能夠看到,三層架構是一個架構模式!
你有沒有一個疑問?兩層架構、三層架構、N層架構爲何不是分層架構風格的表現形式?而是CS架構風格的一種表現形式?
這個問題在後面的CS架構和分層架構中會具體闡述。
再具體一點,咱們看看CS架構的約束:
能夠看到,這裏只是約束了系統分爲Client和Server,以及Server和Client之間的行爲。
再來看三層架構模式,三層架構通常分爲:
能夠看到,三層架構模式比CS架構風格更具體,描述了每一層的做用。
當系統有以下需求時,就能夠考慮三層架構:
用Renan Johannsen de Paula Venilton FalvoJr在《Architectural Patterns and Styles》中對架構模式和架構風格的區別來總結一下:
實際工做中,咱們通常會說「架構」,而沒有具體到是「架構風格」仍是「架構模式」。這麼作其實有幾點好處: