開篇引言
在開發中尤其注重**的可迭代性,這就側重了功能解耦和類之間的解耦。因為在乙個功能更改或者新功能加入的時候,我們
盡量不修改之前的類,而是增加新類
中實現新的功能,或者
只需要更改指定的類
來實現新功能。所以在功能更改的時候,**的可
替換性就顯得十分重要,在舊的邏輯**中,將舊的功能類替換為新的功能類即可。
具體案例分析
開發中有很多需求都是很複雜,繁雜的。可能是多個小的技能組合成的乙個大的功能。比如說乙個文件書寫功能:文件分很多
種類,有文字文件,html文件,word文件等等。由於不同的文件型別書格式不相同,所以我們不能用同乙個類去實現所有型別
的文件書寫,如果都放到同乙個類中書寫,當我們更改其中一種書寫方式的時候,可能不小心就破壞了其他型別文件的實現。這就是單一功能原則存在的原因。雖然各型別的書寫格式不相同,但是最終實現的功能卻是一致的,都是寫文件,所以我們可以有乙個父類具體約束好乙個結構,但是不具體的實現,讓每一種型別的文件具體去實現自己的書寫格式。
案例架構分析
現在需求是編寫乙個書寫文件的程式,寫出的文件具體內容結構如下:
現在我們書寫乙個抽象類builder,用於定義文件結構。然後書寫director類用於呼叫builder類的方法實現編寫文件功能。另外需要兩個builder的子類執行不同文件型別的書寫任務。
textbuilder類執行text文件書寫任務。
htmlbuilder類執行html文件書寫任務
具體實現**
/*** * builder
類,定義了整個功能的結構
,具體的功能由子類執行
* * created by pico-user dragon on 2018/2/7.
*/public abstract classbuilder
/*** director
類 用於功能的完成,但是不會指定具體的功能是什麼
* * created by pico-user dragon on 2018/2/7.
*/public classdirector
public voidcreatetitle(string _title)
public voidcreatecontent(string _str, string _items)
public voidcomplete()
}
/*** textbuilder
類 用於實現具體的功能
(編寫文字文件)*
* created by pico-user on 2018/2/7.
*/public classtextbuilderextendsbuilder
@override
public voidmakestring(string _str)
@override
public voidmakeitems(string _items)
buffer\n");
}@override
public voidclose()
@override
publicstring getresultstr()
}
/*** htmlbuilder
類 用於具體的功能實現(編寫
html文件)
* created by pico-user dragon on 2018/2/7.
*/public classhtmlbuilderextendsbuildercatch(ioexception e)
writer.println("");
writer.println("");
}@override
public voidmakestring(string _str)
@override
public voidmakeitems(string _items)
@override
public voidclose()
@override
publicstring getresultstr()
}
/****分析* 程式入口,呼叫
director
類實現具體的功能,並且決定每乙個功能的實現邏輯
*/public classmain );
director.createcontent("night",newstring);
director.complete();
htmlbuilder htmlbuilder =newhtmlbuilder();
director director1 =newdirector(htmlbuilder);
director1.createtitle("greeting");
director1.createcontent("morning",newstring);
director1.createcontent("night",newstring);
director1.complete();
}}
在上面的功能實現種,有乙個尤其重要的概念,也就是「知道誰」的概念。也就是說在寫**的時候,我們要注意幾個問題:
那個類需要
呼叫那個類的方法,不能呼叫那個類的方法,呼叫這個類的方法好不好。我們回頭看看例項**:main類只是呼叫了
director類的方法就實現了不同型別文件的編寫,main並不知道最終完成每一種文件型別是誰完成的,具體是通過什麼方式去完
成的。main也沒必要知道,因為main只需要知道director能完成就行,只需要跟director進行互動,這樣就避免了更多的類之間
的耦合,也更滿足職責單一原則。而director也只是呼叫了builder類的方法實現了不同型別的文件書寫,它並不知道具體「是誰」
完成了它所指派的任務,並且它也沒必要知道,因為它的任務只是指派文件的書寫,而接受這個任務的人應該是builder,跟別人
沒關係,這同樣是避免了更多類的耦合,同樣滿足職責單一原則。也正是因為這種**風格才有了director不知道子類,才能進行
子類替換的這麼乙個功能,不論將builder的哪乙個子類傳給director都能實現文件的書寫,也就是說對於director來說builder的
子類具體是誰來完成任務,他根本不care,誰來完成都行,這樣**也就更靈活,需要不同功能的時候,只需要替換傳給director的
builder子類即可。
總結因為不知道是誰,才能替換,元件才具有高效性。作為開發人員,必須時刻注意**的質量,注意「可替換性」。
Android設計模式之Builder模式
設計模式是我們在平時程式設計的過程中對一些常見的問題場景總結出來的最優程式設計套路,按照設計模式的思想,我們在程式設計的過程中遇到類似的問題時可以快速的套用對應的設計模式,從而高效的解決問題。在平時的開發過程中,我們也經常接觸到各種設計模式,甚至我們自己寫的 也會不自覺的使用到設計模式,只是可能叫不...
設計模式之Builder模式
builder模式是將複雜物件的構建和他的表示分離,使得同樣的建立過程可以建立不通的表示 其結構圖為 示例 為 class product1 class product2 class builder class concretebuilder1 public builder virtual conc...
設計模式之Builder模式
builder模式 乙個複雜物件的構建與他的表示分離,使得同樣的構建過程可以建立不同的表示 場景 1 相同的方法,不同的執行順序,產生不同的事件結果 2多個部件或零件,都可以裝配到乙個物件中,但是產生的執行結果又不同。3產生類很複雜,產品類中的呼叫順序產生不同的作用 4初始化物件很複雜,引數很多,且...