Java設(shè)計(jì)模式詳解之門面模式(外觀模式)
門面模式(Facade Pattern)也叫外觀模式,它隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供一個(gè)可以訪問系統(tǒng)的接口。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個(gè)接口,來隱藏系統(tǒng)的復(fù)雜性,為子系統(tǒng)中的一組接口提供了一個(gè)統(tǒng)一的高層訪問接口,這個(gè)接口使得子系統(tǒng)更容易被訪問或使用。這種模式涉及到一個(gè)單一的類,該類提供了客戶端請求的簡化方法和對現(xiàn)有系統(tǒng)類方法的委托調(diào)用。
簡而言之,就是把一堆復(fù)雜的流程封裝成一個(gè)接口供給用戶更簡單的使用,這個(gè)設(shè)計(jì)模式里有三個(gè)角色:
1)門面角色( facade ):這是門面模式的核心。它被客戶角色調(diào)用,因此它熟悉子系統(tǒng)的功能。它內(nèi)部根據(jù)客戶角色已有的需求預(yù)定了幾種功能組合。
2)子系統(tǒng)角色(subsystem):實(shí)現(xiàn)了子系統(tǒng)的功能。對它而言, façade 角色就和客戶角色一樣是未知的,它沒有任何 façade 角色的信息和鏈接。
3)客戶角色:調(diào)用 façade 角色來完成要得到的功能。
下面是一個(gè)簡單的實(shí)現(xiàn)實(shí)例:
// 定義了一個(gè)統(tǒng)一的入口 public class ShapeMaker { private Shape circle; private Shape rectangle; private Shape square; public ShapeMaker() { circle = new Circle(); rectangle = new Rectangle(); square = new Square(); } public void drawCircle() { circle.draw(); } public void drawRectangle() { rectangle.draw(); } public void drawSquare() { square.draw(); } } // 直接利用之前定義的外觀類來繪制各種形狀,至于怎么獲得、怎么繪制無需關(guān)注 public class FacadePatternDemo { public static void main(String[] args) { ShapeMaker shapeMaker = new ShapeMaker(); shapeMaker.drawCircle(); shapeMaker.drawRectangle(); shapeMaker.drawSquare(); } }
圖1:UML圖示
class DrawerOne { public void open() { System.out.println("第一個(gè)抽屜被打開了"); getKey(); } public void getKey() { System.out.println("得到第二個(gè)抽屜的鑰匙"); } } class DrawerTwo { public void open() { System.out.println("第二個(gè)抽屜被打開了"); getFile(); } public void getFile() { System.out.println("得到這個(gè)重要文件"); } } class DrawerFacade { DrawerOne darwerOne = new DrawerOne(); DrawerTwo darwerTwo = new DrawerTwo(); public void open() { darwerOne.open(); darwerTwo.open(); } } public class DrawerClient { public static void main(String[] args) { DrawerFacade drawer = new DrawerFacade(); drawer.open(); } }
門面模式使用場景:
(1)為復(fù)雜的模塊或子系統(tǒng)提供外界訪問的模塊。
(2)子系統(tǒng)相對獨(dú)立。
(3)在層次化結(jié)構(gòu)中,可以使用外觀模式定義系統(tǒng)中每一層的入口。
以上所述是小編給大家介紹的Java設(shè)計(jì)模式詳解之門面模式(外觀模式),希望對大家有所幫助!
相關(guān)文章
java實(shí)現(xiàn)隊(duì)列queue數(shù)據(jù)結(jié)構(gòu)詳解
大家好,本篇文章主要講的是java實(shí)現(xiàn)隊(duì)列queue數(shù)據(jù)結(jié)構(gòu)詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02HttpsURLConnection上傳文件流(實(shí)例講解)
下面小編就為大家?guī)硪黄狧ttpsURLConnection上傳文件流(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07微服務(wù)Spring Boot 整合 Redis 實(shí)現(xiàn)UV 數(shù)據(jù)統(tǒng)計(jì)的詳
這篇文章主要介紹了微服務(wù)Spring Boot 整合 Redis 實(shí)現(xiàn) UV 數(shù)據(jù)統(tǒng)計(jì),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01Java對象初始化過程代碼塊和構(gòu)造器的調(diào)用順序
這篇文章主要介紹了Java對象初始化過程代碼塊和構(gòu)造器的調(diào)用順序,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08java ArrayList和Vector的區(qū)別詳解
這篇文章主要介紹了java ArrayList和Vector的區(qū)別詳解的相關(guān)資料,并附簡單實(shí)例代碼,需要的朋友可以參考下2016-11-11解決IDEA?JDK9沒有module-info.java的問題
這篇文章主要介紹了解決IDEA?JDK9沒有module-info.java的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01