java设计模式face_24种设计模式--门面模式【Facede Pattern】
大家都寫過紙質(zhì)的信件吧,比如給女朋友寫情書什么的,寫信的過程大家都還記得吧,先寫信的內(nèi)容,然后寫信封,把信放到信封中,封好,投遞到信箱中進(jìn)行郵遞,這個(gè)過程還是比較簡單的,雖然簡單,這四個(gè)步驟都是要跑的呀,信多了還是麻煩,比如到了情人節(jié),為了大海撈針,給十個(gè)女孩子發(fā)情書,都要這樣跑一遍,你不要累死,更別說你要發(fā)個(gè)廣告信啥的,一下子發(fā) 1 千萬封郵件,那不就完蛋了?那怎么辦呢?還好,現(xiàn)在郵局開發(fā)了一個(gè)新業(yè)務(wù),你只要把信件的必要信息告訴我,我給你發(fā),我來做這四個(gè)過程,你就不要管了,只要把信件交給我就成了。
我們的類圖還是從最原始的狀態(tài)開始:
在這種環(huán)境下,最累的是寫信的人,為了發(fā)送一封信出去要有四個(gè)步驟,而且這四個(gè)步驟還不能顛倒,你不可能沒寫信就把信放到信封吧,寫信的人要知道這四個(gè)步驟,而且還要知道這四個(gè)步驟的順序,恐怖吧,我們先看看這個(gè)過程如何表現(xiàn)出來的:
先看寫信的過程接口,定義了寫信的四個(gè)步驟:
1 packagecom.pattern.facade;2
3 /**
4 * 定義一個(gè)寫信的過程5 *@author http://www.cnblogs.com/initial-road/
6 *7 */
8 public interfaceLetterProcess {9
10 //首先要寫信的內(nèi)容
11 public voidwriteContext(String context);12
13 //其次寫信封
14 public voidfillEnvelope(String address);15
16 //把信放到信封里
17 public voidletterInotoEnvelope();18
19 //然后郵遞
20 public voidsendLetter();21
22 }23
24 寫信過程的具體實(shí)現(xiàn):25 packagecom.pattern.facade.impl;26
27 importcom.pattern.facade.LetterProcess;28
29 /**
30 * 寫信的具體實(shí)現(xiàn)31 *@author http://www.cnblogs.com/initial-road/
32 *33 */
34 public class LetterProcessImpl implementsLetterProcess{35
36 /**
37 * 在信封上填寫必要的信息38 */
39 @Override40 public voidfillEnvelope(String address) {41 System.out.println("填寫地址人地址及姓名..."+address);42 }43
44 /**
45 * 把信放到信封中,并封好46 */
47 @Override48 public voidletterInotoEnvelope() {49 System.out.println("把信放到信封中...");50 }51
52 /**
53 * 塞到郵箱中,郵遞54 */
55 @Override56 public voidsendLetter() {57 System.out.println("郵遞信件...");58 }59
60 /**
61 * 寫信62 */
63 @Override64 public voidwriteContext(String context) {65 System.out.println("填寫信的內(nèi)容..."+context);66 }67
68 }69
70 然后就有人開始用這個(gè)過程寫信了:71 packagecom.pattern.facade;72
73 importcom.pattern.facade.impl.LetterProcessImpl;74
75 /**
76 * 給朋友寫信77 *@author http://www.cnblogs.com/initial-road/
78 *79 */
80 public classClient {81
82 public static voidmain(String[] args) {83
84 //創(chuàng)建一個(gè)處理信件的過程
85 LetterProcess letterProcess = newLetterProcessImpl();86
87 //開始寫信
88 letterProcess.writeContext("Hello are you?");89
90 //開始寫信封
91 letterProcess.fillEnvelope("北京市海淀區(qū)中關(guān)村中科院1002號(hào). Jack");92
93 //把信放到信封里,并封裝好
94 letterProcess.letterInotoEnvelope();95
96 //跑到郵局把信塞到郵箱,投遞
97 letterProcess.sendLetter();98
99 }100
101 }
那這個(gè)過程與高內(nèi)聚的要求相差甚遠(yuǎn),你想,你要知道這四個(gè)步驟,而且還要知道這四個(gè)步驟的順序,一旦出錯(cuò),信就不可能郵寄出去,那我們?nèi)绾蝸砀倪M(jìn)呢?先看類圖:
這就是門面模式,還是比較簡單的,Sub System 比較復(fù)雜,為了讓調(diào)用者更方便的調(diào)用, 就對 Sub System進(jìn)行了封裝,增加了一個(gè)門面,Client 調(diào)用時(shí),直接調(diào)用門面的方法就可以了,不用了解具體的實(shí)現(xiàn)方法以及相關(guān)的業(yè)務(wù)順序,我們來看程序的改變,LetterProcess 接口和實(shí)現(xiàn)類都沒有改變,只是增加了一個(gè)ModenPostOffice 類,我們這個(gè) java 程序清單如下:
1 packagecom.pattern.facade;2
3 importcom.pattern.facade.impl.LetterProcessImpl;4
5 /**
6 * 郵局7 *@author http://www.cnblogs.com/initial-road/
8 *9 */
10 public classModenPostOffice {11 private LetterProcess letterProcess = newLetterProcessImpl();12
13 //寫信,封裝,投遞,一體化了
14 public voidsendLetter(String context, String address){15
16 //幫你寫信
17 letterProcess.writeContext(context);18
19 //寫好信封
20 letterProcess.fillEnvelope(address);21
22 //把信放到信封中
23 letterProcess.letterInotoEnvelope();24
25 //郵遞信件
26 letterProcess.sendLetter();27 }28 }
這個(gè)類就是說現(xiàn)在有郵局提供了一種新型的服務(wù),客戶只要把信的內(nèi)容以及收信地址給他們,他們就會(huì)把信寫好,封好,并發(fā)送出去,這種服務(wù)提出時(shí)大受歡迎呀,這簡單呀,客戶減少了很多工作,那我們看看客戶是怎么調(diào)用的,Client.java 的程序清單如下:
1 packagecom.pattern.facade;2
3 importcom.pattern.facade.impl.LetterProcessImpl;4
5 /**
6 * 給朋友寫信7 *@author http://www.cnblogs.com/initial-road/
8 *9 */
10 public classClient {11
12 public static voidmain(String[] args) {13
14 //現(xiàn)代化的郵局,有這項(xiàng)服務(wù),郵局名稱叫Hell Road
15 ModenPostOffice hellRoadPostOffice = newModenPostOffice();16
17 //你只要把信的內(nèi)容和收信人地址給他,他會(huì)幫你完成一系列的工作18 //定義一個(gè)地址
19 String address = "Happy Road No. 666,God Province,Heaven";20
21 String context = "Hello,It‘s me,do you know who I am? I‘m your old lover.I‘dlike to....";22
23 hellRoadPostOffice.sendLetter(context, address);24
25 }26
27 }
看到?jīng)],客戶簡單了很多,提供這種模式后,系統(tǒng)的擴(kuò)展性也有了很大的提高,突然一個(gè)非常時(shí)期,寄往其他省的郵件都必須進(jìn)行安全檢查,那我們這個(gè)就很好處理了,看類圖:
其他部分在類圖上都不需要改動(dòng),那我們來看源碼:
1 packagecom.pattern.facade;2
3 importcom.pattern.facade.impl.LetterProcessImpl;4
5 /**
6 * 郵局7 *@author http://www.cnblogs.com/initial-road/
8 *9 */
10 public classModenPostOffice {11 private LetterProcess letterProcess = newLetterProcessImpl();12 private Police police = newPolice();13
14 //寫信,封裝,投遞,一體化了
15 public voidsendLetter(String context, String address){16
17 //幫你寫信
18 letterProcess.writeContext(context);19
20 //寫好信封
21 letterProcess.fillEnvelope(address);22
23 //警察叔叔檢查信件了
24 police.checkLetter(letterProcess);25
26 //把信放到信封中
27 letterProcess.letterInotoEnvelope();28
29 //郵遞信件
30 letterProcess.sendLetter();31 }32 }
只是增加了一個(gè) letterPolice 變量的聲明以及一個(gè)方法的調(diào)用,那這個(gè)寫信的過程就變成了這樣:先寫信,然后寫信封,然后警察開始檢查,然后才把信放到信封,然后發(fā)送出去,那這個(gè)變更對客戶來說,是透明的,他根本就看不到有人在檢查他的郵件,他也不用了解,反正現(xiàn)代化的郵件都幫他做了,這也是他樂意的地方。
門面模式講解完畢,這是一個(gè)很好的封裝方法,一個(gè)子系統(tǒng)比較復(fù)雜的實(shí)話,比如算法或者業(yè)務(wù)比較復(fù)雜,就可以封裝出一個(gè)或多個(gè)門面出來,項(xiàng)目的結(jié)構(gòu)簡單,而且擴(kuò)展性非常好。
還有,在一個(gè)較大項(xiàng)目中的時(shí)候,為了避免人員帶來的風(fēng)險(xiǎn),也可以使用這個(gè)模式,技術(shù)水平比較差的成員,盡量安排獨(dú)立的模塊(Sub System),然后把他寫的程序封裝到一個(gè)門面里,盡量讓其他項(xiàng)目成員不用看到這些爛人的代碼,看也看不懂,我也遇到過一個(gè)“高人”寫的代碼,private 方法、構(gòu)造函數(shù)、常量基本都不用,你要一個(gè)public 方法,好,一個(gè)類里就一個(gè) public 方法,所有代碼都在里面,然后你就看吧,一大坨的程序,看著能把人逼瘋,使用門面模式后,對門面進(jìn)行單元測試,約束項(xiàng)目成員的代碼質(zhì)量,對項(xiàng)目整體質(zhì)量的提升也是一個(gè)比較好的幫助。
總結(jié)
以上是生活随笔為你收集整理的java设计模式face_24种设计模式--门面模式【Facede Pattern】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 戴尔台式电脑光盘怎么安装系统重装系统 戴
- 下一篇: 怎么把系统装到u盘 把系统装入U盘的步骤