针对接口编程,不要针对实现编程
這個OO設計原則,策略模式中也有運用,先參照代碼和代碼注釋簡單了解一下:
public abstract class Cat {IEatBehavior pEatBehavior; // 用接口定義一個變量(針對接口編程)public void Eat(){pEatBehavior.Eat(); }... }再寫一個針對實現(xiàn)編程的代碼示例
public abstract class Cat {WhiteCatEatBehavior pWhiteCatEatBehavior; // 用具體類定義一個變量(針對實現(xiàn)編程)public void Eat(){pWhiteCatEatBehavior.Eat(); }... }下面來說說具體是怎么一回事。。。
“針對接口編程”的真正意思是“針對超類型編程(超類型有 接口,超類等)”。針對接口編程 關鍵就在 多態(tài)。利用多態(tài),程序可以針對超類型編程,執(zhí)行時,會根據 實際情況 執(zhí)行到 真正的行為,不會被綁死在 超類型的行為上(特定的具體行為 編寫在 實現(xiàn)了超類型的 類中。如果覺得有點抽象,可以參閱上篇,比如白貓吃的行為 寫在實現(xiàn)了接口?IEatBehavior 的類?WhiteCatEatBehavior 中,而不是寫在超類?Cat 中)。
“針對接口編程” 這句話可以更明確地說成 “變量的 聲明類型 應該是 超類型”(上面例子:IEatBehavior pEatBehavior;),如此,只要是 具體實現(xiàn) 此超類型的類 的所產生對象,都可以指定給這個變量。這也意味著,聲明類時,不用理會 以后執(zhí)行時的 真正對象類型。相應的“針對實現(xiàn)編程”可以說成“變量的聲明類型是具體類”。
再舉一個簡單的例子,假如有一個超類Animal,和兩個實現(xiàn)了超類Animal的具體類Cat,Dog。
針對實現(xiàn)編程:Dog pDog = new DogClass();pDog.Bark();針對接口編程:Animal pAnimal = new DogClass();pAnimal.Bark();你可能會說Animal pAnimal = new?DogClass()后面new的部分不也是面對實現(xiàn)編程嗎?是的,確實,但也有解決方案,你可以使用工廠模式進行創(chuàng)建對象(工廠模式也是設計模式的一種,主要用于創(chuàng)建對象,以達到解耦的目的),這樣就完全符合針對接口編程。當然,也得結合實際情況考慮一下,是否真有必要這樣做。
OO設計原則和各種設計模式都只是一種參考,怎樣有效地使用它,需要根據具體的情況。如果可以用另一種方法可以很好地解決問題,那我們就不必再去糾結如何使用設計模式。我們的目的是簡單有效的解決問題,并且便于以后的維護和擴展,而不是如何使用設計模式。就上面的例子,就無需再使用工廠模式去創(chuàng)建對象,這樣只會使得程序變得更加復雜而已。。。
篇幅比較小,也有點抽象,希望對你有所幫助。。。
轉載于:https://www.cnblogs.com/hachun/p/3445389.html
總結
以上是生活随笔為你收集整理的针对接口编程,不要针对实现编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】Windows Phone 8 开
- 下一篇: FastDFS问题汇总