設計模式之禪(三) -- 接口隔離原則

定義

程序間不依賴不需要的接口重抖,且依賴最小的接口

兩種接口

  • 實例接口
    實例接口書中的意思是java類中new關(guān)鍵字生成的實例,此java類就是實例類的接口(我個人理解是跟依賴倒置或者說面向接口編程一起考慮的昭齐,那樣我們依賴的就是抽象接口,不用考慮實例類矾柜,但是不是所有都適用依賴倒置原則阱驾,所以實體類也可以借鑒接口隔離原則就谜,思想是相通的)
  • 類接口
    類接口就是指Java中interface關(guān)鍵字定義的接口

兩層含義

  • 客戶端不應該依賴它不需要的接口
    這個很好理解,就是類不需要引用它不需要的接口
  • 類間的依賴關(guān)系應該建立在最小的接口上
    這個要求的是接口盡量細化里覆,保證單一原則就好丧荐,接口純潔

實例

書中是以一個星探發(fā)現(xiàn)漂亮女生為例子,介紹了兩種PettyGril判斷方式喧枷,應該做接口分離虹统,首先是接口不分離的代碼

public interface IPettyGirl {
    //好的面容
    void goodLooking();

    //好的身材
    void niceFigure();

    //好的氣質(zhì)
    void greatTemperament();
}

public class PettyGirl implements IPettyGirl {
    //美女名字
    private String name;

    public PettyGirl(String name) {
        this.name = name;
    }

    @Override
    public void goodLooking() {
        System.out.println(this.name + "_面容姣好");
    }

    @Override
    public void niceFigure() {
        System.out.println(this.name + "_身材好");
    }

    @Override
    public void greatTemperament() {
        System.out.println(this.name + "_氣質(zhì)好");
    }
}

public interface ISearcher {

    //搜索美女顯示信息
    void show();
}

public abstract class AbstractSearcher implements ISearcher{

    protected IPettyGirl pettyGirl;

    public AbstractSearcher(IPettyGirl pettyGirl) {
        this.pettyGirl = pettyGirl;
    }

    public abstract void show();
}

public class Searcher extends AbstractSearcher {
    public Searcher(IPettyGirl pettyGirl) {
        super(pettyGirl);
    }

    @Override
    public void show() {
        //展示面容
        super.pettyGirl.goodLooking();
        //展示身材
        super.pettyGirl.niceFigure();
        //展示氣質(zhì)
        super.pettyGirl.greatTemperament();
    }

    public static void main(String[] args) {
        new Searcher(new PettyGirl("lisa")).show();
    }
}

因為現(xiàn)實中存在面容一般,身材一般但是氣質(zhì)非常好的女子隧甚,所以上面一個IPettyGirl需要拆分成兩個接口IGoodBodyGirl和车荔,拆分之后的代碼如下

public interface IGoodBodyGirl {

    //好的面容
    void goodLooking();

    //好的身材
    void niceFigure();
}

public interface IGreatTemperamentGirl {
    //好的氣質(zhì)
    void greatTemperament();
}

public class PettyGirl implements IGoodBodyGirl, IGreatTemperamentGirl {
    //美女名字
    private String name;

    public PettyGirl(String name) {
        this.name = name;
    }

    @Override
    public void goodLooking() {
        System.out.println(this.name + "_面容姣好");
    }

    @Override
    public void niceFigure() {
        System.out.println(this.name + "_身材好");
    }

    @Override
    public void greatTemperament() {
        System.out.println(this.name + "_氣質(zhì)好");
    }
}

public abstract class AbstractSearcher implements ISearcher{

    protected IGoodBodyGirl goodBodyGirl;

    protected IGreatTemperamentGirl greatTemperamentGirl;

    public AbstractSearcher(IGoodBodyGirl goodBodyGirl) {
        this.goodBodyGirl = goodBodyGirl;
    }

    public AbstractSearcher(IGreatTemperamentGirl greatTemperamentGirl) {
        this.greatTemperamentGirl = greatTemperamentGirl;
    }
    
    public AbstractSearcher(IGoodBodyGirl goodBodyGirl, IGreatTemperamentGirl greatTemperamentGirl) {
        this.goodBodyGirl = goodBodyGirl;
        this.greatTemperamentGirl = greatTemperamentGirl;
    }

    public abstract void show();
}

public class Searcher extends AbstractSearcher {
    public Searcher(IGoodBodyGirl goodBodyGirl) {
        super(goodBodyGirl);
    }

    public Searcher(IGreatTemperamentGirl greatTemperamentGirl) {
        super(greatTemperamentGirl);
    }

    public Searcher(IGoodBodyGirl goodBodyGirl, IGreatTemperamentGirl greatTemperamentGirl) {
        super(goodBodyGirl, greatTemperamentGirl);
    }

    @Override
    public void show() {
        //展示面容
        super.goodBodyGirl.goodLooking();
        //展示身材
        super.goodBodyGirl.niceFigure();
        //展示氣質(zhì)
        super.greatTemperamentGirl.greatTemperament();
    }

    public static void main(String[] args) {
        new Searcher(new PettyGirl("lisa"), new PettyGirl("lucy")).show();
    }
}

接口規(guī)范約束

  • 接口要盡量小,但是不能違反單一職責原則
  • 接口要高內(nèi)聚戚扳,就是提高自身的處理能力忧便,減少對外的交互
  • 定制服務,為每個個體提供優(yōu)良的服務咖城,考慮好性能等問題
  • 接口設計是有限度的茬腿,設計粒度越小系統(tǒng)越靈活,但是會增加開發(fā)難度宜雀,降低可維護性

最佳實踐

  • 一個接口只服務于一個子模塊或業(yè)務邏輯
  • 通過業(yè)務邏輯壓縮接口中的public方法切平,接口時長去回顧
  • 已經(jīng)被污染的接口盡量去修改
  • 拒絕盲從,根據(jù)自身業(yè)務邏輯去設計

總結(jié)與思考

在實際的項目開發(fā)中寫接口很容易為了方便寫得臃腫辐董,原因就是邊界并不容易思考得清晰悴品,導致的一個常見問題是兩個接口可能有兩個功能本質(zhì)上是重復的,所以在編寫接口時盡量小且不違反單一職責原則去做简烘。當然也可以在一定項目階段之后做一些項目的回顧并做好CodeReview工作可以盡量減少此類問題苔严。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市孤澎,隨后出現(xiàn)的幾起案子届氢,更是在濱河造成了極大的恐慌,老刑警劉巖覆旭,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件退子,死亡現(xiàn)場離奇詭異,居然都是意外死亡型将,警方通過查閱死者的電腦和手機寂祥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來七兜,“玉大人丸凭,你說我怎么就攤上這事。” “怎么了惜犀?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵铛碑,是天一觀的道長。 經(jīng)常有香客問我向拆,道長亚茬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任浓恳,我火速辦了婚禮,結(jié)果婚禮上碗暗,老公的妹妹穿的比我還像新娘颈将。我一直安慰自己,他們只是感情好言疗,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布晴圾。 她就那樣靜靜地躺著,像睡著了一般噪奄。 火紅的嫁衣襯著肌膚如雪死姚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天勤篮,我揣著相機與錄音都毒,去河邊找鬼。 笑死碰缔,一個胖子當著我的面吹牛账劲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播金抡,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瀑焦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梗肝?” 一聲冷哼從身側(cè)響起榛瓮,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巫击,沒想到半個月后禀晓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡喘鸟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年匆绣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片什黑。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡崎淳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愕把,到底是詐尸還是另有隱情拣凹,我是刑警寧澤森爽,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站嚣镜,受9級特大地震影響爬迟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菊匿,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一付呕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跌捆,春花似錦徽职、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抄瓦,卻和暖如春潮瓶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钙姊。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工毯辅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摸恍。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓悉罕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親立镶。 傳聞我的和親對象是個殘疾皇子壁袄,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容