小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

設(shè)計(jì)模式之創(chuàng)建型模式

 昵稱22369024 2015-05-03

在這部分里,我們關(guān)注GoF里面的結(jié)構(gòu)型模式,它主要是用于描述如何將類組合在一起去構(gòu)成更大的結(jié)構(gòu)。結(jié)構(gòu)型模式包括適配器(Adapter)、裝飾(Decorator)、橋接器(Bridge)、享元(FlyWeight)、門面(Facade)、合成(Composite)以及代理(Proxy)模式。

  下面我們對(duì)上面提到的模式分別進(jìn)行描述。

  1)適配器(Adapter)。當(dāng)我們已經(jīng)開發(fā)出一個(gè)模塊,有一套清晰的接口,并且模塊正在被某個(gè)功能使用(意味著模塊接口改變的可能性不高),這是如果有另外一個(gè)功能也需要使用這個(gè)模塊的功能,但是對(duì)應(yīng)的是一套完全不同的接口,這時(shí)適配器就可以發(fā)揮作用了。

  適配器模式分為兩種,一種是對(duì)象適配器,一種是類適配器,對(duì)象適配器的UML圖如下:

  

  這里Adaptee1和Adaptee2指兩套不同的子系統(tǒng),它們作為Adapter的屬性存在,可以使用IoC的方式指定。

  類適配器的UML圖如下:
  

  同樣是兩個(gè)不同的子系統(tǒng),但是這里我們創(chuàng)建了2個(gè)Adapter類來(lái)分別指向兩個(gè)子系統(tǒng)。在這里我們可以在Client和ITarget之間,設(shè)置一個(gè)Adapter工廠,來(lái)根據(jù)業(yè)務(wù)需求創(chuàng)建不同的Adpater實(shí)例。
  2)裝飾(Decorator),假如我們已經(jīng)開發(fā)了一套功能,然后根據(jù)需求,需要增加一些子功能,而且這些子功能是比較分散比較時(shí)可以增刪的,這時(shí)如果直接修改接口,那么會(huì)造成接口功能復(fù)雜并且不穩(wěn)定,針對(duì)這種情況,我們可以使用裝飾模式。對(duì)應(yīng)的UML圖如下:

  

  上圖中,ConcreteComponent已經(jīng)實(shí)現(xiàn)了Component的基本功能,對(duì)于一些附加的功能,如果放在ConcreteComponent中不合適的話,我們可以像ConcreteDecoratorA一樣,創(chuàng)建一個(gè)基于Decorator的類,通過(guò)SetComponent方法將核心功能和輔助功能串在一起。

  有時(shí),為了簡(jiǎn)單,我們也可以把ConcreteDecorator直接掛在Concretecomponent下面。

  3)橋接器(Bridge),面向?qū)ο筇岢膸讉€(gè)最佳實(shí)踐包括:1)封裝變化;2)面向接口編程;3)組合優(yōu)于繼承;4)類的職責(zé)盡量單一。橋接器完美的體現(xiàn)了這些,通過(guò)創(chuàng)建型模式,我們可以很好地達(dá)到面向接口編程的目標(biāo),也就是說(shuō)我們?cè)诔绦蛑懈髯兞康穆暶黝愋褪墙涌陬愋突蛘叱橄箢?,而具體的實(shí)現(xiàn)類型則由不同的設(shè)計(jì)模式使用不同方式指定。這在接口或者抽象類基本穩(wěn)定的情況下,是很好地,但當(dāng)接口需要發(fā)生變化時(shí),我們?nèi)绾稳ヌ幚??可以看看橋接器的UML圖:

  

  通過(guò)這個(gè)圖,我們可以看出,Implementor接口的變化,對(duì)于Client來(lái)說(shuō),基本是沒(méi)有影響的。Abstraction會(huì)持有Implementor的一個(gè)實(shí)例。

  4)享元(FlyWeight),當(dāng)我們系統(tǒng)中需要使用大量的小對(duì)象,但我們又不希望將所有的小對(duì)象都創(chuàng)建出來(lái)時(shí),可以考慮使用享元模式,它會(huì)抽取小對(duì)象中的公共部分,將其封裝為基類,然后針對(duì)不同條件創(chuàng)建小對(duì)象,同時(shí)在對(duì)象池中維護(hù)這些小對(duì)象,客戶在需要使用小對(duì)象時(shí),首先在對(duì)象池中查找,如果存在,直接返回。對(duì)于小對(duì)象中“個(gè)性”的部分,由調(diào)用小對(duì)象的客戶端進(jìn)行維護(hù)。對(duì)應(yīng)的UML圖如下:
  

  除了上述的簡(jiǎn)單享元,還存在一種復(fù)合享元,對(duì)應(yīng)的UML圖如下:

  

  圖中,CompositeConcreteComponent是不共享的,但是它里面包含很多簡(jiǎn)單的享元,這些享元是共享的,我們可以把它想象成一個(gè)特殊的“享元工廠”。

  通常提到享元,最常見(jiàn)的例子就是文本編輯器中的26個(gè)字母,在.NET中,字符串常量也使用了享元模式。

  在享元模式中,我們通常會(huì)將FlyWeightFactory設(shè)計(jì)為單例模式,否則享元就沒(méi)有意義了。

  5)門面(Facade),如果我們的程序需要深入調(diào)用某個(gè)模塊的內(nèi)部,但我們又不想和模塊過(guò)緊耦合,這時(shí)可以考慮使用門面模式,來(lái)對(duì)外部封裝內(nèi)部子系統(tǒng)的實(shí)現(xiàn)。簡(jiǎn)單的門面可能和代理在某種程度上很相似。

  門面模式?jīng)]有固定的UML圖,它是根據(jù)客戶端的實(shí)際需求以及子系統(tǒng)內(nèi)部的接口來(lái)確定的。

  6)合成(Composite),當(dāng)我們的對(duì)象結(jié)構(gòu)中存在“父子”關(guān)系時(shí),可以考慮使用合成模式。它分為兩種,一種是安全型的合成模式,UML圖如下:

  

  這種類型的合成模式,對(duì)于Component的增、刪、改,都在Composite中維護(hù),Leaf根本不知道這些操作。另一種是透明型的合成模式,UML圖如下:

  

  這種類型的合成模式,自上而下所有的Component都會(huì)有增、刪、改的操作,只不過(guò)對(duì)于Leaf來(lái)說(shuō),這些操作時(shí)沒(méi)有意義的。

  7)代理(Proxy),在編寫程序時(shí),有時(shí)我們希望使用某個(gè)對(duì)象或者模塊的功能,但是因?yàn)榉N種原因,我們不能直接訪問(wèn),這時(shí)就可以考慮使用代理,對(duì)應(yīng)的UML圖如下:

  

  需要注意的是,在這里RealSubject只有一個(gè),如果有多個(gè),那么就是Adapter了。另外,代理也可以加入自己的一些邏輯處理,例如PreExecute和PostExecute。如果這里有多個(gè)Proxy,那么就是Decorator了。

  

  上面就是對(duì)結(jié)構(gòu)型設(shè)計(jì)模式的快速瀏覽,其中有很多UML圖看上去很相似,但深入去思考,每個(gè)模式的出發(fā)點(diǎn)、所要解決的問(wèn)題是不一樣的。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多