1. 程式人生 > >java設計六大原則之開閉原則(OCP)

java設計六大原則之開閉原則(OCP)

抽象化是關鍵

定義抽象類或介面,使其可以有很多的具體實現(openfor extension)

預見所有的需要,在任何情況下都不再修改上層商業邏輯(closedfor modification)

 

對可變性的封裝原則

一種可變性不應當散落在程式碼的很多角落裡,應當將其封裝在物件裡面,同一種可變性的不同表象意味著同一個繼承等級結構中的具體子類,繼承最大的用途就是作為封裝變化的方法

一種可變性不應當與另一種可變性混合在一起,如果繼承結構超過了兩層,這就意味著將兩種不同的可變性混在一起了

 

抽象類

 

1.在Java語言裡面,類有兩種:具體類和抽象類

 具體類可以例項化;抽象類不可以例項化

 

2.抽象類僅提供一個型別的部分實現,抽象類可以有例項變數,以及一個或多個構造子,抽象類可以同時有抽象方法和具體方法。一個抽象類的構造子可以被其子類呼叫,從而使一個抽象類的所有子類都可以有一些共有的實現,而不同的子類可以在此基礎上有自己的實現

 

3.抽象類和子類的這種關係實際上就是模板方法模式

 

抽象類的用途:

1.抽象類通常代表一個抽象概念,它提供一個繼承的出發點。而具體類則不同,具體類可以例項化,應當給出一個有商業邏輯實現的物件模板。由於抽象類不可以例項化,因此一個設計師設計一個新的抽象類,一定用來繼承的。換句話說,具體類就不是用來繼承的

2.ScottMeyers [Effective C++的作者]指出:只要有可能,不要從具體類繼承。在一個以繼承關係形成的樹型結構裡面,樹葉節點都應該是具體類,樹枝節點都應該是抽象類

 

抽象類的用法:

1.抽象類應當擁有儘可能多的共同程式碼

 

1.1在一個從抽象類到多個具體類的繼承關係中,共同的程式碼應當儘量移動到抽象類中,這樣可以提高程式碼的複用率。當需要修改這些共同的程式碼時,設計師只需修改一個地方

 

2抽象類應當擁有儘可能少的資料

 

2.2與程式碼移動的方向相反,資料的移動方向是從抽象類到具體類,一個數據物件不論是否使用都會佔用資源,因此資料應當儘量放到具體類或等級結構的低端


介面

 

1.在家中,可以很容的將微波爐從電源插座上拔下來,然後將手提電腦插上去,那是因為對於電源來說,電器都是可插入構件,它們都具有與電源插座相匹配的插頭

1.1如果可以將一個構件移走,並以另一個構件取而代之,那麼這種構件就是可插入構件(PluggableComponent)

 

2所謂介面,實際上就相當於電源插座;而可插入構件就相當於與這種插座匹配的電器。實現可插入構件的關鍵在於存在一個公共的介面,每個構件都實現了這個介面

2.2介面是實現構件的可插入性(Pluggability)的關鍵

 

Java中的介面

1.Java介面是一些方法特徵的集合,介面中只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被實現並且具有完全不同的行為。當然,Java還允許在介面中定義常量

2.Java介面中的方法只能是abstract和public,介面中不能有構造器,可以有public、static和final的屬性

3.介面將方法的特徵和方法的實現分割開來,這種分割體現在介面常常代表一種角色,它封裝與該角色相關的操作和屬性,而實現這個介面的類就是扮演這個角色的演員

4.一個角色可以由不同的演員來扮演,一個演員也可以扮演不同的角色(一個介面可以被多個類實現,一個類可以實現多個介面)

 

為什麼使用介面:

1.沒有介面,可插入性就沒有保證

1.1關聯的可插入性:如果一個關聯不是針對一個具體類,而是針對一個介面的,那麼任何實現了該介面的類都可以滿足要求。換言之,當前物件並不在意關聯的是哪一個具體類,而僅僅關心這個類是否實現了某個介面

1.2呼叫的可插入性:一個物件不可避免的需要呼叫其他物件的方法,這種呼叫不一定非得是某一個具體類,而可以是一個介面。這樣任何實現了這個介面的具體類都可以被當前物件呼叫;而當前物件呼叫的到底是哪一個具體類的例項則完全可以動態的決定

2.軟體系統的規模越大,生命週期越長,介面的重要性就越大

3.介面使得軟體系統在可擴充套件性、靈活性和可插入性三個方面都得到了保證

--------------------- 作者:咩咩文 來源:CSDN 原文:https://blog.csdn.net/u011659172/article/details/51505640?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!