程序:
1.可維護性 2.可復(fù)用性 3.可擴展性 4.靈活性好
通過封裝套耕、繼承尘应、多態(tài)把程序的耦合度降低
簡單工廠模式:
用一個獨立的類來做這個創(chuàng)造實例的過程
聚合表示一種弱的"擁有關(guān)系"惶凝,體現(xiàn)的是A對象可以包含B對象吼虎,但B對象不是A對象的一部分。
合成表示一種強的"擁有關(guān)系", 體現(xiàn)了嚴(yán)格的部分和整體的關(guān)系苍鲜,部分和整體的生命周期一樣思灰。
優(yōu)點:工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動態(tài)實例化相關(guān)的類坡贺。官辈,對于客戶端來說,去除了與具體產(chǎn)品的依賴遍坟。
策略模式:
它定義了算法家族拳亿,分別封裝起來,讓它們之間可以互相替換愿伴,此模式讓算法的變化肺魁,不會影響到使用算法的用戶。
裝飾模式:
動態(tài)地給對象添加一些額外的職責(zé)(為功能動態(tài)添加更多功能的一種方式)隔节,就增加功能來說鹅经,裝飾模式比生成子類更加的靈活。
好處:有效的把類的核心職責(zé)和裝飾功能區(qū)分開了怎诫。
裝飾模式將每個要裝飾的功能都放在單獨的類中瘾晃,并讓這個類包裝它所要裝飾的對象,一次幻妓,當(dāng)需要執(zhí)行特殊行為時蹦误,客戶代碼就可以在運行時根據(jù)需要有選擇地、按順序地使用裝飾功能包裝對象了肉津。
有效的把類的核心職責(zé)和裝飾功能區(qū)分開了强胰,而且可以去除相關(guān)類中重復(fù)的裝飾邏輯。
代理模式:
(雙方不需要知道對方的存在妹沙,通過中間人進行代碼的調(diào)用)
為其他對象提供一種代理以控制對這個對象的訪問
遠程代理:也就是為一個對象在不同的地址空間提供局部代表偶洋,這樣可以隱藏一個對象存在于不同地址空間的事實。
虛擬代理:是根據(jù)需要創(chuàng)建開銷很大的對象距糖。通過它來存放實例化需要很長時間的真實對象[DP]玄窝。
安全代理:用來控制真實對象訪問的權(quán)限[DP]。
智能指引:是指當(dāng)調(diào)用真實的對象時肾筐,代理處理另外一些事[DP]哆料。
工廠方法模式:
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類吗铐。工廠方法使一個類的實例化延遲到其子類东亦。
原型模式:
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象
(一般在初始化的信息不發(fā)生變化的情況下, 克隆是最好的方法典阵。這即隱藏了對象的創(chuàng)建細節(jié)奋渔,又對性能是大大的提高)
淺復(fù)制:被復(fù)制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象壮啊。
深復(fù)制:把引用對象的變量都指向復(fù)制過的新對象嫉鲸,而不是原有的被引用的對象。
簡單來說:淺復(fù)制復(fù)制值類型歹啼,引用類型賦值的是引用的地址 深復(fù)制引用類型復(fù)制的是引用類型的對象玄渗,就是在需要改變的值的基類中聲明一個克隆方法并在具體類中調(diào)用
模版方法模式:
定義了一個操作中的算法的骨架,而將一些步驟延遲到子類中狸眼,模版方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟藤树。
當(dāng)我們要完成在某一細節(jié)層次一致的一個過程或一個系列步驟,但其個別步驟在更詳細的層次上的實現(xiàn)可能不同時拓萌,我們同城考慮使用模版方法岁钓。
通過把不變行為搬移到超類,去除子類中的重復(fù)代碼來提現(xiàn)它的優(yōu)勢微王。模版方法模式提供了一很好的代碼復(fù)用平臺屡限。
外觀模式:
為子系統(tǒng)中的一組接口提供一個一致的界面,此模式定義了一個高層接口炕倘,這個接口使得這一子系統(tǒng)更加容易使用钧大。
簡單來說:就是將你一次需要調(diào)用的方法整理在一個接口里面,調(diào)用接口罩旋,直接就調(diào)用了方法拓型。
建造者模式(生成器模式):
用戶只需制定需要建造的類型就可以得到它們,而具體建造過程和細節(jié)就不需知道了瘸恼。
將一個復(fù)雜對象的構(gòu)造與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示册养。
簡單來說:我們需要建造一樣?xùn)|西东帅,客戶端不需要知道建造過程,只需要知道要造什么就可以了球拦。
觀察者模式:
觀察者模式定義了一種一對多的依賴關(guān)系靠闭,讓多個觀察者對象同時監(jiān)聽一個主題對象,這個主題對象在狀態(tài)發(fā)生變化時坎炼,會通知所有觀察者對象愧膀,使它們能夠自己更新自己。
抽象工廠模式:
提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口谣光,而無需指定它們具體的類檩淋。
好處:易于交換產(chǎn)品系列。具體的創(chuàng)建實例過程與客戶端分離萄金◇霸茫客戶端是通過它們的抽象接口操縱實例媚朦,產(chǎn)品的具體類名也被具體工廠的實現(xiàn)分離,不會出現(xiàn)在客戶代碼中日戈。
狀態(tài)模式:
當(dāng)一個對象的內(nèi)在狀態(tài)改變時允許改變其作為询张,這個對象看起來是像是改變了其類。
將特定的狀態(tài)相關(guān)的行為都放入一個對象中浙炼,由于所有與狀態(tài)相關(guān)的代碼都存在于某個ConcreteState中份氧,所有通過定義新的子類可以很容易地增加新的狀態(tài)和轉(zhuǎn)換。
簡單來說“對象的行為取決于它的狀態(tài)弯屈,并且需要在運行時改變它的狀態(tài)蜗帜。那么就應(yīng)該用狀態(tài)模式。
當(dāng)你有大量的判斷語句季俩,那么將每一個判斷寫成一個方法钮糖。當(dāng)達到某一個要求的時候,提供另外一個且只有一個方法酌住,減少了相互之間的耦合性店归。
適配器模式:
當(dāng)系統(tǒng)的數(shù)據(jù)和行為都正確,但結(jié)構(gòu)不符時酪我,我們應(yīng)該考慮用適配器消痛,目的就是使控制范圍之外的一個原有對象和某個接口匹配。適配器模式主要應(yīng)用于希望復(fù)用一些現(xiàn)存的類都哭,但是接口又與復(fù)用環(huán)境要求不一致的情況秩伞。
簡單來說:當(dāng)兩個類需要互相調(diào)用,但是接口不符合的時候欺矫,就用適配器模式纱新,講接口適配成相同的,進行匹配穆趴。(當(dāng)然脸爱,只有當(dāng)無法改變原有設(shè)計和代碼的情況下,才考慮適配模式)
備忘錄模式:
在不破壞封裝性的前提下未妹,捕獲一個對象的內(nèi)部狀態(tài)簿废,并在該對象之外保存這個狀態(tài),這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)络它。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)族檬。
用于功能比較復(fù)雜的,但需要維護和記錄屬性歷史的類化戳。
缺點:會非常消耗內(nèi)存
組合模式:
將對象組合成樹形結(jié)構(gòu)以表示"部分-整體"的層次結(jié)構(gòu)单料。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
當(dāng)你發(fā)現(xiàn)需求中是體現(xiàn)部分與整體層次的結(jié)構(gòu)時,以及你希望用于可以忽略組合對象與單個對象的不同看尼,統(tǒng)一地使用組合結(jié)構(gòu)中的所有對象時递鹉,就應(yīng)該考慮組合模式。
組合模式的體現(xiàn)方式有點像樹狀結(jié)構(gòu)藏斩,不斷的細分下去躏结。
迭代器模式:
提供一種方法順序訪問一個聚合對象中各個元素,而又不暴露該對象的內(nèi)部表示狰域。
類似于foreach循環(huán)
這樣做的目的就是不讓外部訪問到內(nèi)部的結(jié)構(gòu)媳拴,但是可以訪問到內(nèi)部的數(shù)據(jù)。
單例模式:
保證一個類僅有一個實例兆览,并提供一個訪問它的全局的訪問點屈溉。
通常我們可以讓一個全局變量使得一個對象的被訪問,但它不能放置你實例化對個對象抬探。所以我們需要然各類自身負責(zé)保存它的唯一實例子巾。這個類可以爆照沒有其他實例可以被創(chuàng)建,并且它可以提供一個額訪問該實例的方法小压。
簡單來說:就是對唯一實例的受控訪問线梗。
多線程的單例模式:在多個線程中,我們需要同時訪問某一個類的時候怠益,這樣就會同時創(chuàng)建多個實例仪搔,所以 我們需要加一把鎖來處理(lock),如果有一個線程已經(jīng)處在代碼的臨界區(qū)內(nèi)的時候,另外一個線程就需要等待蜻牢,直到臨界區(qū)內(nèi)的線程被釋放烤咧。
橋接模式:
將抽象部分與它的實現(xiàn)部分分離,使他們都可以獨立地變化抢呆。
簡單來說:我們需要多角度分類的時候煮嫌,可以用橋接模式,讓它們各自變化抱虐。這部分變化不會影響到其他實現(xiàn)立膛。從而達到應(yīng)對變化的目的,減少他們之間的耦合性梯码。
命令模式:
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化好啰,對請求排隊或記錄請求日志轩娶,以及支持可撤銷的操作。
職責(zé)鏈模式:
當(dāng)多個對象都有機會處理這個事件的時候框往,就將這個對象連成一條鏈鳄抒,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
中介者模式:
用一個中介者對象來封裝一系列的對象交互许溅,中介者使各對象不需要顯式地相互引用瓤鼻,從而降低耦合性。而且可以獨立地改變它們之間的交互贤重。(缺點是:不容易維護)
享元模式:
運用共享技術(shù)有效地支持大量細粒度的對象茬祷。(當(dāng)一個程序使用大量的對象的時候,就應(yīng)該考慮享元模式)
簡單來說:就是在程序的開發(fā)過程中并蝗,有許多實例大部分內(nèi)容都是相同的祭犯,那么我們就需要通過享元模式大幅度的減少單個實例的數(shù)目,從而降低服務(wù)器的占用資源滚停。
解釋器模式:
給定一個語言沃粗,定義它的文法的一種表示,并定義一個解釋器键畴,這個解釋器使用該表示來解釋語言中的句子最盅。
簡單來說:就是語言翻譯器的功能,當(dāng)輸入一段文字后起惕,通過返回得到一段固定不變的文字涡贱。
訪問器模式(GoF中最復(fù)雜的模式):
表示一個作用與某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用與這個元素的新操作疤祭。
訪問器模式適用于數(shù)據(jù)結(jié)構(gòu)相對穩(wěn)定的系統(tǒng)盼产,因為它的作用是把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作之間的耦合性解脫開,使得操作集合可以相對自由地演化勺馆。(假設(shè)如果你需要增加一個新的操作的時候戏售,就要增加一個新的訪問者,那么訪問器模式就是講有關(guān)的行為集中到一個訪問者對象中草穆,)
單一職責(zé)原則
就一個類而言灌灾,應(yīng)該僅有一個引起它變化的原因(如果你能夠想到多于一個的動機去改變一個類,那么這個類就具有多一個的職責(zé)悲柱,就應(yīng)該考慮類的職責(zé)分離)
開放-封閉原則
對擴展是開放的锋喜。對更改是關(guān)閉的。
依賴倒轉(zhuǎn)原則
抽象不應(yīng)該依賴細節(jié)豌鸡,細節(jié)應(yīng)該依賴于抽象
高層模塊不應(yīng)該依賴低層模塊嘿般。兩個都應(yīng)該依賴抽象
里氏代換原則
子類型必須能夠替換它們的父類型
只有當(dāng)子類可以替換掉父類,軟在·件單位的功能不受到影響時涯冠,父類才能真正被復(fù)用炉奴,而子類也能夠在父類的基礎(chǔ)上增加新的行為。
真是因為子類的可替換性才使得使用父類類型的模塊在無需修改的情況下就可以擴展蛇更。
如果編寫時考慮的都是如何針對抽象編程而不是針對細節(jié)編程瞻赶,即程序中所有的依賴關(guān)系都是終止于抽象類或者接口赛糟,那就是面向?qū)ο蟮纳鋼簦粗蔷褪沁^程化的設(shè)計砸逊。
迪米特原則
如果兩個類不必彼此直接通信璧南,那么這兩個類就不應(yīng)當(dāng)發(fā)生直接的相互作用,如果其中一個類需要調(diào)用另一個類的某一個方法的話师逸,可以通過第三者轉(zhuǎn)發(fā)這個調(diào)用司倚。
合成/聚合復(fù)用原則
如果新對象的某些功能在別的已經(jīng)創(chuàng)建好的對象里面已經(jīng)實現(xiàn),那么盡量使用別的對象提供的功能字旭,使之成為新對象的一部分对湃,而不要自己再重新創(chuàng)建。新對象通過向這些對象的委派達到復(fù)用已有功能的遗淳。
簡而言之拍柒,要盡量使用合成/聚合,盡量不要使用繼承屈暗。
接口隔離原則
不需要將所有的東西都放在一個接口里面拆讯,應(yīng)該是定義多個功能專一的接口。過于臃腫的接口只會強迫客戶依賴于不需要的方法养叛。