對於是否需要快取算乙個需求的話(兩種情況),讀取的流的型別是了另乙個需求(兩種情況),輸入還是輸出又是乙個需求如果採用繼承的話(兩種情況),需要的類有:
帶快取/位元組型/輸入流;
帶快取/位元組型/輸出流;
帶快取/字元型/輸入流;
帶快取/字元型/輸出流;
不帶快取/位元組型/輸入流;
不帶快取/位元組型/輸出流;
不帶快取/字元型/輸入流;
不帶快取/字元型/輸出流;
這裡只考慮了幾情況已經需要繼承的類的數量已經開始變得非常大(實際上,數量是每方面的可能相乘,2*2*2)。
如果採用裝飾模式,一旦你覺得需要增加乙個功能,那你只需要將現有的類作為引數傳入到建構函式就行:
file file=new file("/home/lxx/test");
fileinputstream fi=new fileinputstream(file);
//這時候,你認為需要乙個帶快取的檔案輸入流
bufferedinputstream bis=new bufferedinputstream(fi);
也就是說,不再需要對所有的型別進行組合,而是對每種單方面的型別創造乙個類就可以。 為什麼優先使用組合而不是繼承
繼承具有如下優點 實現新的類非常容易,因為基類的大部分功能都可以通過繼承關係自動賦予派生類 修改或者擴充套件繼承來的實現非常容易 只要修改父類,派生的類的行為就同時被修改了。初學物件導向程式設計的人會認為繼承真是乙個好東西,是實現復用的最好手段。但是隨著應用的深入就會發現繼承有很多缺點 繼承破壞封裝...
為什麼是「深度」學習而不是寬度?
為什麼是深度而不是寬度?先說說我個人的理解,如下圖所示,圓圈表示神經元,有兩種方式。第一種,只有一層神經層,有8個神經元 第二種方式,有兩層神經層,分別有2個和4個神經元。相比之下,第一種更 寬 更 淺 第二種更 窄 更 深 對於每個輸入,兩種方式都可能產生8種結果 第一種 8 1 第二種 2 4 ...
為什麼要優先使用組合 而不是繼承?
繼承具有如下優點 實現新的類非常容易,因為基類的大部分功能都可以通過繼承關係自動賦予派生類 修改或者擴充套件繼承來的實現非常容易 只要修改父類,派生的類的行為就同時被修改了。初學物件導向程式設計的人會認為繼承真是乙個好東西,是實 現復用的最好手段。但是隨著應用的深入就會發現繼承有很多缺點 繼承破壞封...