为什么有人说面向对象编程就是面向接口编程?
"面向?qū)ο缶幊叹褪敲嫦蚪涌诰幊?#34;
這句話相信, 很多人都在網(wǎng)上見過, 裝b利器.
我一開始也是這么想的, 那些裝b者丟下這一句, 就沒下文了.
首先, 我認為這句話是1個假命題.
但是, 這句話是1個很好的建議, 也就是我們應該盡量地"面向接口編程".
一, 什么是面向?qū)ο缶幊?/span>
這個問題, 相信很多人包括我也無法準確表達出答案.
我大概做個總結(jié).
1. 首先, 你要用到面向?qū)ο蟮木幊陶Z言, 例如java, C# 等.
2. 其次, 用到面向?qū)ο蟮?大特性.? 封裝, 繼承, 和多態(tài). 其中最重要的是多態(tài).
二, 什么是面向接口編程.
我自己的理解:
在任何1個類(無論是抽象類或非抽象類,客戶端除外)中,? 盡量不要出現(xiàn)非抽象類或者其對象.
當然完全不出現(xiàn)非抽象類是不可能的.
但是至少(建議你做到)
1. 類的某個成員(屬性)如果位于構(gòu)造函數(shù)參數(shù)中,? 或者這個成員有set()方法, 則這個成語不是1個非抽象類的對象(可以是接口或抽象類的對象)
2. 方法的參數(shù)不是1個非抽象類的對象.
也就是講, 類里面盡量做到只寫接口或者抽象類的名字, 而不是具體某個類的名字.
三, 為什么要面向接口編程.
1. 實現(xiàn)多態(tài).2. 減少耦合性.
3. 令各個成員依賴與抽象, 而不是依賴與具體.
4. 方便維護和擴展.
上面的答案, 也是一搜一大堆.? 令人一頭霧水.
其實上面4點, 根本的原因就是第4點. 方便維護和擴展.
也就是常常提到的封閉-開放原則.
四, 什么是封閉-開放原則.
所謂封閉開放原則就是.
對修改封閉, 對擴展開放. (注意, 客戶端代碼修改是無可避免的, 指的是業(yè)務類的代碼修改封閉)
當你寫代碼寫到一半(或者已經(jīng)release),?? 你的產(chǎn)品經(jīng)理讓你增加點或者修改某些東西.
看起來只需要修改一點點東西, 實際上如果類設計不好的話, 可能會牽一發(fā)動全身.
就是所謂的維護成本很大.
是不是連捅產(chǎn)品經(jīng)理一刀的心都有了,? 聽說最近深圳剛捅了1個..(悲劇默哀)
其實根本的解決方法就是一開始, 合理的設計類, 應用合理的設計模式.
盡量做到, 一旦有增加或者修改需求,?
我們都無需修改以前的類(對修改封閉)
而只需增加1個新的類(通常是子類,?? 對擴展開放)
這個例子太極端?
更加極端的都有,?? 其實你用到大部分的類都是不能改的, 要么你沒有修改權(quán)限, 要么它們是用jar包發(fā)布...
所以設計模式就十分重要了.
五, 類里面出現(xiàn)具體類的缺點.
用1個很簡單很簡單的例子.
假如你的經(jīng)理要你寫1個投資者類,? 它可以買股票
你是這樣寫的(當然下面兩個類寫在兩個文件內(nèi))
好了, 過兩天, 經(jīng)理要你加入買基金的功能.
除了添加Fund類外.
你還要在 Invester里添加 buyFund()的方法.
如果過兩天經(jīng)理再要你加入買期貨的功能.
再加入buyCommodity()方法.
實際上這樣, 你已經(jīng)break了對修改封閉的原則了.
而Invester里面的越來越臃腫, 太多類似功能的方法.
六, 改成面向接口
上面的根本錯誤就是Invseter的方法出現(xiàn)了非抽象類對象的參數(shù) Stock s
我們應該把它改成1個接口.
例如我們添加1個可以投資的接口, 讓股票類Stock去實現(xiàn)這個接口
public class Invester{public void buyInvest(Investable i,int amount){.....i.buy(amount);.....} }public class Stock() implements Investable{@Overridepublic void buy(int amount){}; }public interface Investable{void buy(int amount); }如上面修改后的例子,
Invester里出現(xiàn)的就是接口名字Investable.? 就是所謂的面向接口編程了.
一旦經(jīng)理叫你添加買基金方法.
只需要添加Fund類, 讓它實現(xiàn)Investable接口.
而無需修改其他類的代碼.
通過這個例子我們再想深一層
加入這個程序不只投資者這個角色, 例如還有投資經(jīng)理(InvestmentMgr), 律師(Lawer).
它們很可能有類似的行為, 例如交稅(tax), 獲利(benefit) 等.
那么最好都把交稅, 獲利等行為寫成接口, 讓它們?nèi)崿F(xiàn)這些接口.
對這個程序的擴展性是有十分大的好處的.
總結(jié)
以上是生活随笔為你收集整理的为什么有人说面向对象编程就是面向接口编程?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 观察者模式(Observer) 简介
- 下一篇: java 回调(callback)函数简