2.Lsp。所謂任何地方假如你期待的是一個父類型Base,那么把它替換成任何的子類型Derived1, Derived2,程序都能正常工作。 還是關于需求者的。假如你做到了ask no more,比如說你只需要Base提供的功能,就不要在接口上要求Derived1, Derived2,如此,我們自然可以任意替換實際的實現。 假如你做到了ask no less,需要InputStreamReader就直接要求InputStreamReader而不是Reader,你就不會需要在代碼中做downcast到InputStreamReader的動作。也就不會出現把Reader替換成StringReader之后出現的運行時錯誤。
3.單一職責原則。一個模塊只應該做一件事。 仍然是需求者的設計方法。這里的“事”的概念應該是一個正交于其它“事”的功能。兩個互相緊密耦合的“事”其實是一件事。 根據ask no more,假如一個模塊做了兩件正交的事,也就是把兩個正交的模塊耦合在一起,就意味著在我這個濫模塊的某個地方有從一個模塊到另一個模塊的不正當的需求。你要求了你不應該要求的。
4。Ocp。開閉原則。軟件,模塊應該是可以不用改動代碼而被擴展的。 其實,ocp與其說是一個原則,不如說是一個理想。它并沒有指出具體的可操作方法,而只是給了一個目標。 一些人認為這就意味著類可以繼續。這個看法太狹隘了。擴展一個模塊固然可以用繼續和override,但是,用接口組合一樣可以做到。要害是,假如你的模塊依靠抽象的接口而不是具體的類,那么別人就可以很輕易通過接口組合,adapter, decorator什么的通過給你傳遞不同的接口實現而達到擴展的目的。 這里面,仍然是一個簡單的ask no more在起作用。
總而言之,所謂面向接口,對需求者來說,就是:用接口定義好自己需要的功能,no more, no less。而所謂“多態”,就是用來實現接口用的工具而已。 完了。