複製鏈接
請複製以下鏈接發送給好友

接口隔離原則

鎖定
客户端不應該依賴它不需要的接口。一個類對另一個類的依賴應該建立在最小的接口上。
中文名
接口隔離原則
外文名
Interface Segregation Principle
英文簡稱
ISP
性    質
名詞
領    域
計算機

目錄

接口隔離原則簡介

使用多個專門的接口比使用單一的總接口要好。
一個類對另外一個類的依賴性應當是建立在最小的接口上的。
一個接口代表一個角色,不應當將不同的角色都交給一個接口。沒有關係的接口合併在一起,形成一個臃腫的大接口,這是對角色和接口的污染。
“不應該強迫客户依賴於它們不用的方法。接口屬於客户,不屬於它所在的類層次結構。”這個説得很明白了,再通俗點説,不要強迫客户使用它們不用的方法,如果強迫用户使用它們不使用的方法,那麼這些客户就會面臨由於這些不使用的方法的改變所帶來的改變。

接口隔離原則舉例説明

使用場合,提供調用者需要的方法,屏蔽不需要的方法.滿足接口隔離原則.比如説電子商務的系統,有訂單這個類,有三個地方會使用到,
一個是用户,只能有查詢方法,
一個是外部系統,有添加訂單的方法,
一個是管理後台,添加刪除修改查詢都要用到.
根據接口隔離原則(ISP),一個類對另外一個類的依賴性應當是建立在最小的接口上.
也就是説,對於用户,它只能依賴有一個查詢方法的接口.
UML結構如下:
接口隔離原則 接口隔離原則
下面是實現的代碼.
//--這兒不用接口繼承,因為可能出現修改了父接口影響了子接口
interface IOrderForPortal{
    String getOrder();
}
interface IOrderForOtherSys{
    String insertOrder();
    String getOrder();
}
interface IOrderForAdmin{ //extendsIOrderForPortal,IOrderForOtherSys
    String deleteOrder();
    String updateOrder();
    String insertOrder();
    String getOrder();
}
/*
interface IOrderForPortal{
    String getOrder();
}
interface IOrderForOtherSys{
    String insertOrder();
}
interface IOrderForAdmin extendsIOrderForPortal,IOrderForOtherSys{
    String updateOrder();
    String deleteOrder();
}
*/
class Order implements IOrderForPortal,IOrderForOtherSys,IOrderForAdmin{
    private Order(){
        //--什麼都不幹,就是為了不讓直接 new,防止客户端直接New,然後訪問它不需要的方法.
    }
    //返回給Portal
    public static IOrderForPortal getOrderForPortal(){
        return (IOrderForPortal)new Order();
    }
    //返回給OtherSys
    public static IOrderForOtherSys getOrderForOtherSys(){
        return (IOrderForOtherSys)new Order();
    }
    //返回給Admin
    public static IOrderForAdmin getOrderForAdmin(){
        return (IOrderForAdmin)new Order();
    }
    //--下面是接口方法的實現.只是返回了一個String用於演示
    public String getOrder(){
        return "implemented getOrder";
    }
    public String insertOrder(){
        return "implemented insertOrder";
    }
    public String updateOrder(){
        return "implemented updateOrder";
    }
    public String deleteOrder(){
        return "implemented deleteOrder";
    }
}
public class TestCreateLimit{
    public static void main(String[] args){
        IOrderForPortal orderForPortal =Order.getOrderForPortal();
        IOrderForOtherSys orderForOtherSys =Order.getOrderForOtherSys();
        IOrderForAdmin orderForAdmin = Order.getOrderForAdmin();
        System.out.println("Portal門户調用方法:"+orderForPortal.getOrder());
        System.out.println("OtherSys外部系統調用方法:"+orderForOtherSys.insertOrder());
        System.out.println("Admin管理後台調用方法:"+orderForAdmin.getOrder()+";"+orderForAdmin.insertOrder()+";"+orderForAdmin.updateOrder()+";"+orderForAdmin.deleteOrder());
    }
}

這樣就能很好的滿足接口隔離原則了,調用者只能訪問它自己的方法,不能訪問到不應該訪問的方法.