欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

面向?qū)ο笤O(shè)計(jì)模式的核心法則

 更新時(shí)間:2013年11月10日 10:22:14   投稿:zxhpj  
有本經(jīng)典的書(shū)叫《設(shè)計(jì)模式》,講了經(jīng)典的21種設(shè)計(jì)模式,建議大家都看看

1. 單一職責(zé)

就一個(gè)類(lèi)而言,應(yīng)該僅有一個(gè)引起它變化的原因。
如果一個(gè)類(lèi)承擔(dān)的職責(zé)過(guò)多,就等于把這些職責(zé)耦合在一起,一個(gè)職責(zé)的變化可能會(huì)削弱或者抑制這個(gè)類(lèi)完成其他職責(zé)的能力。這種耦合會(huì)導(dǎo)致脆弱的設(shè)計(jì),當(dāng)變化發(fā)生時(shí),設(shè)計(jì)會(huì)遭到意想不到的。
軟件設(shè)計(jì)真正要做的許多內(nèi)容,就是發(fā)現(xiàn)職責(zé)并把那些職責(zé)互相分離。如果你多于一個(gè)動(dòng)機(jī)去改變一個(gè)類(lèi),那么這個(gè)類(lèi)就具有多于一個(gè)的職責(zé)。
 
2. 開(kāi)放封閉

軟件實(shí)體(類(lèi),模塊,函數(shù)等)應(yīng)該可以擴(kuò)展,但是不可修改。也就是說(shuō),對(duì)于擴(kuò)展是開(kāi)放的,對(duì)于更改是封閉的。
如此設(shè)計(jì),面對(duì)需求的改變可以保持相對(duì)的穩(wěn)定,從而使系統(tǒng)可以在第一個(gè)版本以后不斷的推出新的版本。
無(wú)論模塊是多么的’封閉’,都會(huì)存在一些無(wú)法對(duì)之封閉的變化。既然不可能完全封閉,設(shè)計(jì)人員必須對(duì)于他設(shè)計(jì)的模塊應(yīng)該對(duì)哪種變化封閉做出選擇。他必須先猜測(cè)出最有可能發(fā)生的變化種類(lèi),然后構(gòu)造抽象來(lái)隔離那些變化。
等到變化發(fā)生時(shí)立即采取行動(dòng)。

在我們最初編寫(xiě)代碼時(shí),假設(shè)變化不會(huì)發(fā)生。當(dāng)變化發(fā)生時(shí),我們就創(chuàng)建抽象來(lái)隔離以后發(fā)生的同類(lèi)變化。
面對(duì)需求,對(duì)程序的改動(dòng)是通過(guò)增加新代碼進(jìn)行的,而不是更改現(xiàn)有的代碼。
我們希望的是在開(kāi)發(fā)工作展開(kāi)不久就知道可能發(fā)生的變化。查明可能發(fā)生的變化所等待的時(shí)間越長(zhǎng),要?jiǎng)?chuàng)建正確的抽象就越困難。
開(kāi)放-封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在。遵循這個(gè)原則可以帶來(lái)面向?qū)ο蠹夹g(shù)所聲稱(chēng)的巨大好處,也就是可維護(hù)、可擴(kuò)展、可復(fù)用、靈活性好。開(kāi)發(fā)人員應(yīng)該僅對(duì)程序中呈現(xiàn)出頻繁變化的那些部分做出抽象,然而,對(duì)于應(yīng)用程序中的每個(gè)部分都可以的進(jìn)行抽象同樣不是一個(gè)好主意。拒絕不成熟的抽象和抽象本身一樣重要。

3. 依賴(lài)倒轉(zhuǎn)

高層模塊不應(yīng)該依賴(lài)底層模塊。兩個(gè)都應(yīng)該依賴(lài)抽象。
抽象不應(yīng)該依賴(lài)細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴(lài)抽象。
抽象不應(yīng)該依賴(lài)細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴(lài)于抽象,針對(duì)接口編程,不要對(duì)實(shí)現(xiàn)編程。
依賴(lài)倒轉(zhuǎn)其實(shí)可以說(shuō)是面向?qū)ο笤O(shè)計(jì)的標(biāo)志,用哪種語(yǔ)言來(lái)寫(xiě)程序并不重要,如果編寫(xiě)時(shí)考慮的都是如何針對(duì)抽象編程而不是針對(duì)細(xì)節(jié)編程, 即程序中所有的依賴(lài)關(guān)系都終止于抽象類(lèi)或者接口,那就是面向?qū)ο蟮脑O(shè)計(jì),反之那就是過(guò)程化的設(shè)計(jì)了。

4. 里氏代換

一個(gè)軟件實(shí)體如果使用的是一個(gè)父類(lèi)的話,那么一定適用于其子類(lèi),而且察覺(jué)不出父類(lèi)對(duì)象與子類(lèi)對(duì)象的區(qū)別。也就是說(shuō),在軟件里面,把父類(lèi)都替換成它的子類(lèi),程序的行為沒(méi)有變化。
子類(lèi)型必須能用替換掉它們的父類(lèi)型。
只有當(dāng)子類(lèi)可以替換掉父類(lèi),軟件單位的功能不受到影響時(shí),父類(lèi)才能真正被復(fù)用,而子類(lèi)也能夠在父類(lèi)的基礎(chǔ)上增加新的行為。

5. 合成/聚合復(fù)用

盡量使用合成/聚合,盡量不要使用類(lèi)繼承。
優(yōu)先使用對(duì)象的合成/聚合將有助于你保持每個(gè)類(lèi)被封裝并被集中在單個(gè)任務(wù)上,這樣累和類(lèi)繼承層次會(huì)保持較小的規(guī)模,并且不大可能增長(zhǎng)為不可控制的龐然大物。

6. 迪米特法則

如果兩個(gè)類(lèi)不必彼此直接通信,那么著兩個(gè)類(lèi)就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中一個(gè)類(lèi)需要調(diào)用另一個(gè)類(lèi)的某一個(gè)方法的話,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。
在類(lèi)的結(jié)構(gòu)設(shè)計(jì)上,每一個(gè)類(lèi)都應(yīng)當(dāng)盡量降低成員的訪問(wèn)權(quán)限,也就是說(shuō),一個(gè)類(lèi)包裝好自己的private狀態(tài),不需要讓別的類(lèi)知道的字段或行為就不要公開(kāi)。
迪米特法則其根本思想是強(qiáng)調(diào)了類(lèi)之間的松耦合。

類(lèi)之間的耦合越弱,越有利于復(fù)用,一個(gè)處在弱耦合的類(lèi)被修改,不會(huì)對(duì)有關(guān)系的類(lèi)造成波及。

輔助資料:

常用創(chuàng)建型設(shè)計(jì)模式(其他類(lèi)型模式就不提了,自己看書(shū))

創(chuàng)建型模式隱藏了這些類(lèi)的實(shí)例是如何被創(chuàng)建和放在一起,整個(gè)系統(tǒng)關(guān)于這些對(duì)象所知道的是由抽象類(lèi)所定義的接口。這樣,創(chuàng)建型模式在創(chuàng)建了什么、誰(shuí)創(chuàng)建它=它是怎么被創(chuàng)建的,以及何時(shí)創(chuàng)建這些方面提供了很大的靈活性。

1. 工廠方法模式(Factory Method)

定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi),工廠模式使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。
創(chuàng)建型模式抽象了實(shí)例化的過(guò)程,它們幫助一個(gè)系統(tǒng)如何創(chuàng)建、組合和表示它的那些對(duì)象。創(chuàng)建型模式都會(huì)將關(guān)于該系統(tǒng)使用哪些具體的類(lèi)的信息封裝起來(lái)。允許客戶(hù)用結(jié)構(gòu)和功能差別個(gè)很大的’產(chǎn)品’對(duì)象配置一個(gè)系統(tǒng)。配置可以是靜態(tài)的,即在編譯時(shí)制定,也可以是動(dòng)態(tài)的,就是運(yùn)行時(shí)再指定。
通常設(shè)計(jì)應(yīng)該是從工廠方法開(kāi)始,當(dāng)設(shè)計(jì)者發(fā)現(xiàn)需要更大的靈活性時(shí),設(shè)計(jì)便會(huì)向其他創(chuàng)建型模式演化。當(dāng)設(shè)計(jì)者在設(shè)計(jì)標(biāo)準(zhǔn)之間進(jìn)行權(quán)衡的時(shí)候,了解多個(gè)創(chuàng)建型模式可以給設(shè)計(jì)者更多的選擇余地。

2. 抽象工廠模式(Abstract Factory)

提供一個(gè)創(chuàng)建一系列或者相關(guān)依賴(lài)對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。

3. 建造者模式(Builder)

將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
內(nèi)聚性與耦合性 內(nèi)聚性描述的是一個(gè)例程內(nèi)部組成部分之間相互聯(lián)系的緊密程度。而耦合性描述的是一個(gè)例程與其他例程之間聯(lián)系的緊密程度。軟件開(kāi)發(fā)的目標(biāo)應(yīng)該是創(chuàng)建這樣的例程:內(nèi)部完整,也就是高內(nèi)聚,而與其他例程之間的聯(lián)系則是小巧、直接、可見(jiàn)、靈活的,這樣就是松耦合。
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,這就可以很容易地改變一個(gè)產(chǎn)品的內(nèi)部表示,并且使得構(gòu)造代碼和表示代碼分開(kāi)。這樣對(duì)于客戶(hù)來(lái)說(shuō),它無(wú)需關(guān)心產(chǎn)品的創(chuàng)建過(guò)程,而只要告訴我需要什么,我就能用同樣的構(gòu)建過(guò)程創(chuàng)建不同的產(chǎn)品給客戶(hù)。

4. 原型模式(Prototype)

用原型的實(shí)例制定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。
建立相依數(shù)目的原型并克隆它們通常比每次用合適的狀態(tài)手工實(shí)例化該類(lèi)更方便一些。

5. 單例模式(Singleton)

保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。
對(duì)一些類(lèi)來(lái)說(shuō),一個(gè)實(shí)例是很重要的。一個(gè)全局變量可以使得一個(gè)對(duì)象被訪問(wèn),但它不能防止客戶(hù)實(shí)例化多個(gè)對(duì)象。單例的優(yōu)勢(shì)就是讓類(lèi)自身負(fù)責(zé)保存它的唯一實(shí)例。這個(gè)類(lèi)可以保證沒(méi)有其他實(shí)例可以被創(chuàng)建,并且單例還提供了一個(gè)訪問(wèn)該實(shí)例的方法。這樣就使得對(duì)唯一的實(shí)例可以嚴(yán)格地控制客戶(hù)怎樣以及何時(shí)訪問(wèn)它。

相關(guān)文章

最新評(píng)論