設計模式6大原則:接口隔離原則
首先看看接口隔離原則的定義,有兩種定義
第一種:Clients should not be forced to depend upon interfaces that they don't use.(客戶端不應該強行以來它不需要的接口)
第二種:The dependency of one class to another one should depend on the smallest possible interface.(類間的依賴關系應該建立在最小的接口上)
而這里的接口,卻不僅僅指的是通過interface關鍵字定義的接口,接口分為2種:
1、對象接口(Object Interface)
JAVA中聲明的一個類,通過new關鍵字產生的一個實例,它是對一個類型的事物的描述,這也是一種接口。例如:
Phone phone = new Phone();這里的類Person就是實例phone的一個接口
2、類接口(Class Interface)
這種接口就是通過interface關鍵字定義的接口了
也就是說,接口隔離原則要求的是在一個模塊應該只依賴它需要的接口,以保證接口的小純潔。而且需要保證接口應該盡量小,即設計接口的時候應該讓接口盡量細化,不要定義太臃腫的接口(比如接口中有很多不相干的邏輯的方法聲明)。
接口隔離原則與單一職責原則有些相似,不過不同在于:單一職責原則要求的是類和接口職責單一,注重的是職責,是業務邏輯上的劃分。而接口隔離原則要求的是接口的方法盡量少,盡量有用(針對一個模塊)
在使用接口隔離原則的時候需要有一些規范:
1.接口盡量小
接口盡量小主要是為了保證一個接口只服務一個子模塊或者業務邏輯
2.接口高內聚
接口高內聚是對內高度依賴,對外盡可能隔離。即一個接口內部的聲明的方法相互之間都與某一個子模塊相關,且是這個子模塊必須的。
3.接口設計是有限度的
但是如果完全遵循接口隔離原則的話,會出現一個問題。即接口的設計力度會越來越小,這樣就造成了接口數量劇增,系統復雜度一下子增加了,而這不是真實項目所需要的,所以在使用這個原則的時候還要在特定的項目,根據經驗或者嘗試判斷,不過沒有一個固定的標準。
舉個例子
在春熙路上逛街,到處都是女的,有穿著絲襪的大媽(惡心一下),有文靜的女生,有性感的辣妹,總之很多女的。然而當你對前面喊一聲“美女,錢掉了”,估計前面連同大媽一起回頭看看,以為在叫自己。如今美女這個詞已經變得大眾化了,反正跟女的打招呼就說美女。但是真正的美女是這樣嗎,男淫們心中的美女應該是這樣的:身材好、長相好、氣質佳。
IPrettyGirl.java:定義美女標準
- //定義美女接口
- public interface IPrettyGirl {
- //長相好
- public void greatLooks();
- //好身材
- public void greatFigure();
- //氣質佳
- public void greatTemperament();
- }
PrettyGril.java:實現美女類
- public class PrettyGirl implements IPrettyGirl {
- private String name;
- //構造函數,美女名字
- public PrettyGirl(String name)
- {
- this.name = name;
- }
- //好身材
- @Override
- public void greatFigure() {
- System.out.println(name+":身材非常好");
- }
- //好長相
- @Override
- public void greatLooks() {
- System.out.println(name+":長相非常好");
- }
- //好氣質
- @Override
- public void greatTemperament() {
- System.out.println(name+":氣質非常好");
- }
- }
AMan:是個抽象類,抽象出一個男人來
- public abstract class AMan {
- protected IPrettyGirl prettyGirl;
- public AMan(IPrettyGirl prettyGirl)
- {
- this.prettyGirl = prettyGirl;
- }
- //帥哥開始找美女啦
- public abstract void findGirl();
- }
Man:
- public class Man extends AMan {
- public Man(IPrettyGirl prettyGirl) {
- super(prettyGirl);
- }
- @Override
- public void findGirl() {
- System.out.println("美女在這里:----------------------");
- super.prettyGirl.greatLooks();
- super.prettyGirl.greatFigure();
- super.prettyGirl.greatTemperament();
- }
- }
場景類,春熙路,帥哥開始尋找美女了
- public class ChunxiRoad {
- public static void main(String args[])
- {
- IPrettyGirl jiajia = new PrettyGirl("佳佳");
- AMan man = new Man(jiajia);
- man.findGirl();
- }
- }
運行結果:
美女在這里:---------------------- 佳佳:長相非常好 佳佳:身材非常好 佳佳:氣質非常好
但是這里有個問題,接口劃分的不是很清晰,比如有些男人認為某些女生長相好,身材好就是美女(而不管這個女的素質啥樣,比如那些“壓脈帶”)。而某些女生雖然長相一般,身材也一般,但是氣質很好,這就是某些宅男心目中的氣質型美女,或者三者具備。所以需要把接口劃分的再細一點以滿足不同男人的審美觀。
我們把接口分為兩種:
好身材
- public interface IGreatBody {
- //好長相
- public void greatLooks();
- //身材
- public void greatFigure();
- }
好氣質
- public interface IGreatTemperament {
- //氣質好
- public void greatTemperament();
- }
然后我們就可以根據自己的需求來尋找自己心目中認為的美女啦,舉個例子
上面的AMan和Man傳遞的接口變為IGreatBody
接下來,我們來到了--東京。看到了cang老師
- public class Tokyo {
- public static void main(String args[])
- {
- IGreatBody canglaoshi = new PrettyGirl("cang老師");
- AMan man = new Man(canglaoshi);
- man.findGirl();
- }
- }
運行結果:
美女在這里:---------------------- cang老師:長相非常好 cang老師:身材非常好
原文鏈接:http://www.cnblogs.com/loulijun/archive/2012/03/07/2382247.html
【編輯推薦】