JAVA設(shè)計(jì)模式----外觀模式

??最近準(zhǔn)備好好研究下Retrifot的源代碼 , 因?yàn)镽etrofit的主要業(yè)務(wù)用到了外觀模式,正好以前沒有仔細(xì)研究過這種設(shè)計(jì)模式瞭稼,同時(shí)也是為了降低研究Retrofit源碼的難度杉畜,所以做下關(guān)于外觀設(shè)計(jì)模式的功課湿弦。為了方便看官理解裁良,無關(guān)的代碼部分盡可能的使用了偽代碼凿将。

??進(jìn)入正題 , 軟件開發(fā)中時(shí)常出現(xiàn),需要與多個(gè)復(fù)雜子系統(tǒng)進(jìn)行交互的情況趴久,倘若直接與各個(gè)子系統(tǒng)進(jìn)行交互必定會(huì)出現(xiàn)較高的耦合性丸相。如果存在某一個(gè)中間對(duì)象專門負(fù)責(zé)與各個(gè)子系統(tǒng)進(jìn)行交互搔确,而第三方只需要與該中間對(duì)象交互即可彼棍,這便是外觀模式的由來。


QQ圖片20181217152344.png

??如上圖,沒有使用外觀模式之前膳算,各個(gè)系統(tǒng)之間的交互的復(fù)雜性座硕,而使用了外觀模式后,使用Facade中間對(duì)象與各個(gè)子系統(tǒng)進(jìn)行交互涕蜂,整個(gè)系統(tǒng)的耦合性一下就降低了华匾。

標(biāo)準(zhǔn)外觀模式:

??外觀模式中所指的子系統(tǒng)是一個(gè)廣義的概念,它可以是一個(gè)類机隙、一個(gè)功能模塊蜘拉、系統(tǒng)的一個(gè)組成部分或者一個(gè)完整的系統(tǒng)。子系統(tǒng)類通常是一些業(yè)務(wù)類有鹿,實(shí)現(xiàn)了一些具體的旭旭、獨(dú)立的業(yè)務(wù)功能。
??以文件加解密為例上實(shí)例代碼葱跋,文件加解密可以分為三個(gè)模塊持寄, 讀取文件源梭,加解密文件,寫入文件稍味。其UML圖如下:

1354688525_6684.jpg
class FileReader  
{  
       public string Read(string fileNameSrc)   
       {  
           ......  
       }  
} 
class CipherMachine  
{  
      public string Encrypt(string plainText)   
      {  
          Console.Write("數(shù)據(jù)加密废麻,將明文轉(zhuǎn)換為密文:");  
          ......  
          return es;  
}  
class FileWriter  
{  
       public void Write(string encryptStr,string fileNameDes)   
       {  
             ......          
       }  
}

重點(diǎn)在EncryptFacade上,用于與各個(gè)子系統(tǒng)進(jìn)行直接交互.

class EncryptFacade  
{  
        //維持對(duì)其他對(duì)象的引用  
        private FileReader reader;  
        private CipherMachine cipher;  
        private FileWriter writer;  
  
        public EncryptFacade()  
        {  
            reader = new FileReader();  
            cipher = new CipherMachine();  
            writer = new FileWriter();  
        }  
  
        //調(diào)用其他對(duì)象的業(yè)務(wù)方法  
         public void FileEncrypt(string fileNameSrc, string fileNameDes)  
        {  
            string plainStr = reader.Read(fileNameSrc);  
            string encryptStr = cipher.Encrypt(plainStr);  
            writer.Write(encryptStr, fileNameDes);  
        }  
}  
class Program  
{  
        static void Main(string[] args)  
        {  
            EncryptFacade ef = new EncryptFacade();  
            ef.FileEncrypt("src.txt", "des.txt");  
            Console.Read();  
        }  
}  

抽象外觀模式

??在標(biāo)準(zhǔn)的外觀模式中模庐,如果需要增加烛愧、刪除或更換與外觀類交互的子系統(tǒng)類,必須修改外觀類或客戶端的源代碼赖欣,這將違背開閉原則屑彻,因此可以通過引入抽象外觀類來對(duì)系統(tǒng)進(jìn)行改進(jìn),在一定程度上可以解決該問題顶吮。
??在引入抽象外觀類之后社牲,客戶端可以針對(duì)抽象外觀類進(jìn)行編程,對(duì)于新的業(yè)務(wù)需求悴了,不需要修改原有外觀類搏恤,而對(duì)應(yīng)增加一個(gè)新的具體外觀類,由新的具體外觀類來關(guān)聯(lián)新的子系統(tǒng)對(duì)象湃交,同時(shí)通過修改配置文件來達(dá)到不修改任何源代碼并更換外觀類的目的熟空。
??如,現(xiàn)在我們不滿意原有的那種加解密方式了,想要使用一種新的加解密方式替代搞莺。

??使用抽象外觀模式更改后的UML圖.


1354689057_4412.jpg

??其中,FileReader和FileWriter使用的仍然是之前的類息罗,這里只不過是增加了一個(gè)新的加解密類NewCipherMachine,一個(gè)新的中間對(duì)象NewEncryptFacade,一個(gè)抽象類AbstractEncryptFacade.

abstract class AbstractEncryptFacade  
{  
        public abstract void FileEncrypt(string fileNameSrc, string fileNameDes);  
}
class NewEncryptFacade extends AbstractEncryptFacade  
{  
        private FileReader reader;  
        private NewCipherMachine cipher;  
        private FileWriter writer;  
  
        public NewEncryptFacade()  
        {  
            reader = new FileReader();  
            cipher = new NewCipherMachine();  
            writer = new FileWriter();  
        }  
  
        public override void FileEncrypt(string fileNameSrc, string fileNameDes)  
        {  
            string plainStr = reader.Read(fileNameSrc);  
            string encryptStr = cipher.Encrypt(plainStr);  
            writer.Write(encryptStr, fileNameDes);  
        }  
}  
class NewCipherMachine  
{  
        public string Encrypt(string plainText)   
        {  
            Console.Write("數(shù)據(jù)加密才沧,將明文轉(zhuǎn)換為密文:");  
            迈喉。。温圆。挨摸。。岁歉。
            return es;  
        }  
} 

這里使用配置文件得运,通過在代碼中選擇加載配置文件,從而使用對(duì)應(yīng)的Facade對(duì)象锅移,以此來調(diào)用不同的加解密類熔掺。

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <appSettings>  
    <add key="facade" value="FacadeSample.NewEncryptFacade"/>  
  </appSettings>  
</configuration>  
class Program  
{  
        static void Main(string[] args)  
        {  
            AbstractEncryptFacade ef; //針對(duì)抽象外觀類編程  
            //讀取配置文件  
            string facadeString = ConfigurationManager.AppSettings["facade"];  
            //反射生成對(duì)象  
            ef = (AbstractEncryptFacade)。非剃。置逻。。努潘。诽偷。(facadeString);  
            ef.FileEncrypt("src.txt", "des.txt");  
            Console.Read();  
        }  
} 

總結(jié):

??自我感覺坤学,即便是抽象外觀模式,做的還是不夠好报慕,
每次要增加一個(gè)新的功能或者方法時(shí)深浮,就需要增加一個(gè)新的功能類以及一個(gè)新的中間Facade類,雖然通過配置文件可以選擇調(diào)用不同的功能類,但是感覺還是不夠眠冈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末码秉,一起剝皮案震驚了整個(gè)濱河市盅称,隨后出現(xiàn)的幾起案子途事,更是在濱河造成了極大的恐慌血崭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雇盖,死亡現(xiàn)場離奇詭異忿等,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崔挖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門贸街,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狸相,你說我怎么就攤上這事薛匪。” “怎么了脓鹃?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵逸尖,是天一觀的道長。 經(jīng)常有香客問我瘸右,道長娇跟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任尊浓,我火速辦了婚禮逞频,結(jié)果婚禮上纯衍,老公的妹妹穿的比我還像新娘栋齿。我一直安慰自己,他們只是感情好襟诸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布瓦堵。 她就那樣靜靜地躺著,像睡著了一般歌亲。 火紅的嫁衣襯著肌膚如雪菇用。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天陷揪,我揣著相機(jī)與錄音惋鸥,去河邊找鬼杂穷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卦绣,可吹牛的內(nèi)容都是我干的耐量。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼滤港,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼廊蜒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溅漾,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤山叮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后添履,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屁倔,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年暮胧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汰现。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叔壤,死狀恐怖瞎饲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炼绘,我是刑警寧澤嗅战,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站俺亮,受9級(jí)特大地震影響驮捍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脚曾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一东且、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧本讥,春花似錦珊泳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撞芍,卻和暖如春秧了,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背序无。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工验毡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衡创,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓晶通,卻偏偏與公主長得像钧汹,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子录择,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚拔莱、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,734評(píng)論 0 14
  • 迪米特法則(最少知識(shí)原則) 一個(gè)軟件實(shí)體應(yīng)當(dāng)盡可能少的與其他實(shí)體發(fā)生相互作用隘竭。 外觀模式核心 為子系統(tǒng)提供統(tǒng)一的入...
    GaaraZ閱讀 384評(píng)論 0 0
  • 1 場景問題# 1.1 生活中的示例## 外觀模式在現(xiàn)實(shí)生活中的示例很多塘秦,比如:組裝電腦,通常會(huì)有兩種方案动看。 一個(gè)...
    七寸知架構(gòu)閱讀 6,197評(píng)論 7 57
  • 1尊剔、外觀模式的概念 外觀模式(Facade),可以理解為菱皆,為子系統(tǒng)中的一組接口提供一個(gè)一致的界面须误,此模式定義了一個(gè)...
    鋼镚koala閱讀 171評(píng)論 0 1
  • 外觀模式(Facade Pattern):現(xiàn)在系統(tǒng)變得越來越復(fù)雜,子系統(tǒng)眾多仇轻,外部要與一個(gè)子系統(tǒng)的通信京痢,必須通過一...
    zidea閱讀 402評(píng)論 0 6