【正文】
統(tǒng)提供了各種不同形狀的按鈕,客戶端代碼可針對這些按鈕進(jìn)行編程,用戶可能會(huì)改變需求要求使用不同的按鈕,原始設(shè)計(jì)方案如圖所示: ? 現(xiàn)對該系統(tǒng)進(jìn)行重構(gòu),使之滿足開閉原則的要求。 ?第二種更容易理解的定義方式如下: ? 所有引用基類(父類)的地方必須能透明地使用其子類的對象 。 芭芭拉 馮諾依曼獎(jiǎng)得主?,F(xiàn)任麻省理工學(xué)院電子電氣與計(jì)算機(jī)科學(xué)系教授。 Page 19 里氏代換原則 ? 里氏代換原則分析 ?里氏代換原則可以通俗表述為:在 軟件中如果能夠使用基類對象,那么一定能夠使用其子類對象 。 ?里氏代換原則是實(shí)現(xiàn)開閉原則的重要方式之一,由于使用基類對象的地方都可以使用子類對象,因此 在程序中盡量使用基類類型來對對象進(jìn)行定義,而在運(yùn)行時(shí)再確定其子類類型,用子類對象來替換父類對象 。如圖所示: Da ta O pe ra to rcip he rAcip he rB: C ip he rA: C ip he rB+++se tC ip he rA (C ip he rA c ip he rA )se tC ip he rB (C ip he rB c ip he rB )en cry pt (S trin g pl ai nT ex t): v oi d: v oi d: S trin gCi ph er A+ en cry pt (S trin g pl ai nT ex t) : S trin gCi ph er B+ en cry pt (S trin g pl ai nT ex t) : S trin gCl ie nt+ m ai n (S trin g ar gs []) : v oi dPage 22 里氏代換原則 ? 里氏代換原則實(shí)例 ?實(shí)例說明 ? 如果需要更換一個(gè)加密算法類或者增加并使用一個(gè)新的加密算法類,如將 CipherA改為 CipherB,則需要修改客戶類 Client和數(shù)據(jù)操作類 DataOperator的源代碼,違背了開閉原則。 Page 23 里氏代換原則 ? 里氏代換原則實(shí)例 ?實(shí)例解析 Page 24 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則定義 ?依賴倒轉(zhuǎn)原則 (Dependence Inversion Principle, DIP)的定義如下: ? 高層模塊 不應(yīng)該依賴低層模塊 ,它們都應(yīng)該 依賴抽象 。 ?另一種表述為: ? 要 針對接口編程 , 不要針對實(shí)現(xiàn)編程 。 Page 26 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則分析 ?簡單來說,依賴倒轉(zhuǎn)原則就是指: 代碼要依賴于抽象的類,而不要依賴于具體的類 ; 要針對接口或抽象類編程,而不是針對具體類編程 。 Page 27 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則分析 ?依賴倒轉(zhuǎn)原則的常用實(shí)現(xiàn)方式之一是 在代碼中使用抽象類,而將具體類放在配置文件中 。 Page 29 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則分析 ?依賴注入 Page 30 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則分析 ?依賴注入 ? 構(gòu)造注入 (Constructor Injection):通過 構(gòu)造函數(shù) 注入實(shí)例變量。 ? 接口注入 (Interface Injection):通過 接口方法 注入實(shí)例變量。 } public interface AbstractReader { public void read()。 public ConcreteReader(AbstractBook book) { = book。 } } Page 32 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則分析 ?設(shè)值注入 public interface AbstractBook { public void view()。 public void read()。 public void setBook(AbstractBook book) { = book。 } } Page 33 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則分析 ?接口注入 public interface AbstractBook { public void view()。 } public class ConcreteBook implements AbstractBook { public void view() { ...... } } public class ConcreteReader implements AbstractReader { public void read(AbstractBook book) { ()。 Da ta ba se So ur ceMa in Cl as s+ m ai n (S trin g ar gs []) : v oi dT ex tS ou rceX ML T ra ns fo rm erX LS T ra ns fo rm erPage 35 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則實(shí)例 ?實(shí)例說明 ? 由于需求的變化,該系統(tǒng)可能需要增加新的數(shù)據(jù)源或者新的文件格式,每增加一個(gè)新的類型的數(shù)據(jù)源或者新的類型的文件格式,客戶類 MainClass都需要修改源代碼,以便使用新的類,違背了開閉原則。 Page 36 依賴倒轉(zhuǎn)原則 ? 依賴倒轉(zhuǎn)原則實(shí)例 ?實(shí)例解析 DatabaseSourceMainC lass+ m ain (String args[]) : voidT ex tSourceX MLT ransform erX LST ransform erA bstractSourceA bstractT ransform er...... so u r ce N a m e D a t a b a se S o u r ce / so u r ce N a m e t r a n sf o r m e r N a m e X M L T r a n sf o r m e r / t r a n sf o r m e r N a m e ......co n f i g . x m lPage 37 接口隔離原則 ? 接口隔離原則定義 ?接口隔離原則 (Interface Segregation Principle, ISP)的定義如下: