設計模式有23種,分爲三類:java
一個類A負責多個職責時,要將A的粒度分解成對應職責的類,對應單個職責,在後期對某個職責進行更改時,不會對其餘職責形成影響。下降類的複雜度編程
一個類不該該依賴不須要的接口,即一個類對另外一個類的以來應該創建在最小接口上,當要以來的接口中有不須要的部分,就應該將大的接口拆分紅小接口,保證依賴的接口都是須要的設計模式
抽象不要依賴細節,細節要依賴抽象優化
低層模塊最好是依賴抽象,抽象中不要有具體操做,具體操做交給細節this
繼承要遵照里氏替換原則設計
抽象--》接口或者抽象類3d
細節--》實現類代理
依賴關係的三種傳遞方式code
接口傳遞對象
interface IOpenAndClose{ public void open(ITV tv); } interface ITV{ public void play(); } //實現接口 class OpenAndClose implements IOpenAndClose{ public void open(ITV tv){ tv.play(); } }
構造方法傳遞
interface IOpenAndClose{ public void open(); } interface ITV{ public void play(); } //實現接口 class OpenAndClose implements IOpenAndClose{ private ITV tv; public OpenAndClose(ITV tv){ //使用構造器 this.tv = tv; } public void open(){ this.tv.play(); } }
setter傳遞
interface IOpenAndClose{ public void open(ITV tv); public void setTv(ITV tv); } interface ITV{ public void play(); } //實現接口 class OpenAndClose implements IOpenAndClose{ private ITV tv; public void setTv(ITV tv){ //調用setter方法 this.tv = tv; } public void open(){ this.tv.play(); } }
正確使用繼承:全部引用基類的方法必須能透明的使用其子類的對象。子類中不要輕易重寫父類的方法,能夠經過聚合,組合,依賴的方法來解決問題,讓子類和父類再也不繼承,而是共同繼承一個更加基礎的base類,關於父類中子類須要的方法,能夠經過依賴或者繼承來獲取對象並調用方法,能夠下降耦合
普通的繼承
遵照里氏替換的改進
提供方(被依賴)--》開放擴展
使用方(依賴)--》修改關閉
如圖:paint爲使用方,三個類型類是提供方,當咱們要添加新的繪畫類型時,不只要建立新的類,還要在paint中添加新的方法,這樣自違背了開閉原則,代碼擴展性也很低
如下優化遵照了開閉原則,將具體的各個類型的draw方法實如今各自的實現類中,paint依賴抽象,只須要調用Shape對象的draw方法,對應調用各自實現類的draw方法,這樣就達到目的,使用方無需更改。
直接朋友:B是A的成員變量,B是A中方法的入參,B是A中方法的返回值類型
以上三種狀況稱爲B是A的直接朋友,其它的爲陌生類
迪米特法則:陌生類最好不要以局部變量的形式出如今類的內部;以下降類與類之間的耦合
對於被依賴的類無論有多複雜,都封裝在類的內部,對外只提供public方法,不要泄露任何信息;
儘可能使用聚合和合成,不要使用繼承
如下爲依賴,組合,聚合的類圖