大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

面向對象設計原則

接口隔離原則

面向對象設計原則除了開閉原則、里氏替換原則、依賴倒置原則和單一職責原則以外,還有接口隔離原則、迪米特法則和合成復用原則。本節將詳細介紹接口隔離原則。

接口隔離原則的定義

接口隔離原則(Interface Segregation Principle,ISP)要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感興趣的方法。

2002 年羅伯特·C.馬丁給“接口隔離原則”的定義是:客戶端不應該被迫依賴于它不使用的方法(Clients should not be forced to depend on methods they do not use)。該原則還有另外一個定義:一個類對另一個類的依賴應該建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。

以上兩個定義的含義是:要為各個類建立它們需要的專用接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調用。

接口隔離原則和單一職責都是為了提高類的內聚性、降低它們之間的耦合性,體現了封裝的思想,但兩者是不同的:

• 單一職責原則注重的是職責,而接口隔離原則注重的是對接口依賴的隔離。

• 單一職責原則主要是約束類,它針對的是程序中的實現和細節;接口隔離原則主要約束接口,主要針對抽象和程序整體框架的構建。

接口隔離原則的優點

接口隔離原則是為了約束接口、降低類對接口的依賴性,遵循接口隔離原則有以下 5 個優點。

1. 將臃腫龐大的接口分解為多個粒度小的接口,可以預防外來變更的擴散,提高系統的靈活性和可維護性。

2. 接口隔離提高了系統的內聚性,減少了對外交互,降低了系統的耦合性。

3. 如果接口的粒度大小定義合理,能夠保證系統的穩定性;但是,如果定義過小,則會造成接口數量過多,使設計復雜化;如果定義太大,靈活性降低,無法提供定制服務,給整體項目帶來無法預料的風險。

4. 使用多個專門的接口還能夠體現對象的層次,因為可以通過接口的繼承,實現對總接口的定義。

5. 能減少項目工程中的代碼冗余。過大的大接口里面通常放置許多不用的方法,當實現這個接口的時候,被迫設計冗余的代碼。

接口隔離原則的實現方法

在具體應用接口隔離原則時,應該根據以下幾個規則來衡量。

• 接口盡量小,但是要有限度。一個接口只服務于一個子模塊或業務邏輯。

• 為依賴接口的類定制服務。只提供調用者需要的方法,屏蔽不需要的方法。

• 了解環境,拒絕盲從。每個項目或產品都有選定的環境因素,環境不同,接口拆分的標準就不同深入了解業務邏輯。

• 提高內聚,減少對外交互。使接口用最少的方法去完成最多的事情。

下面以學生成績管理程序為例介紹接口隔離原則的應用。

【例1】學生成績管理程序。

分析:學生成績管理程序一般包含插入成績、刪除成績、修改成績、計算總分、計算均分、打印成績信息、査詢成績信息等功能,如果將這些功能全部放到一個接口中顯然不太合理,正確的做法是將它們分別放在輸入模塊、統計模塊和打印模塊等 3 個模塊中,其類圖如圖 1 所示。

圖1 學生成績管理程序的類圖

程序代碼如下:

package principle;
public class ISPtest
{
    public static void main(String[] args)
    {
        InputModule input =StuScoreList.getInputModule();
        CountModule count =StuScoreList.getCountModule();
        PrintModule print =StuScoreList.getPrintModule();
        input.insert();
        count.countTotalScore();
        print.printStuInfo();
        //print.delete();
    }
}
//輸入模塊接口
interface InputModule
{
    void insert();
    void delete();
    void modify();
}
//統計模塊接口
interface CountModule
{
    void countTotalScore();
    void countAverage();
}
//打印模塊接口
interface PrintModule
{
    void printStuInfo();
    void queryStuInfo();
}
//實現類
class StuScoreList implements InputModule,CountModule,PrintModule
{
    private StuScoreList(){}
    public static InputModule getInputModule()
    {
        return (InputModule)new StuScoreList();
    }
    public static CountModule getCountModule()
    {
        return (CountModule)new StuScoreList();
    }
    public static PrintModule getPrintModule()
    {
        return (PrintModule)new StuScoreList();
    }
    public void insert()
    {
        System.out.println("輸入模塊的insert()方法被調用!");
    }
    public void delete()
    {
        System.out.println("輸入模塊的delete()方法被調用!");
    }
    public void modify()
    {
        System.out.println("輸入模塊的modify()方法被調用!");
    }
    public void countTotalScore()
    {
        System.out.println("統計模塊的countTotalScore()方法被調用!");
    }
    public void countAverage()
    {
        System.out.println("統計模塊的countAverage()方法被調用!");
    }
    public void printStuInfo()
    {
        System.out.println("打印模塊的printStuInfo()方法被調用!");
    }
    public void queryStuInfo()
    {
        System.out.println("打印模塊的queryStuInfo()方法被調用!");
    }
}

程序的運行結果如下:

輸入模塊的insert()方法被調用!
統計模塊的countTotalScore()方法被調用!
打印模塊的printStuInfo()方法被調用!

 

全部教程
主站蜘蛛池模板: 狠狠操狠狠干 | 毛片毛片毛片毛片 | 日韩欧美在线播放 | 精品久久视频 | 久久免费福利视频 | 日本一级毛片在线观看 | 亚洲手机中文字幕 | 国产成人aa在线观看视频 | 国产精品久久久久久一区二区三区 | 欧美色图片区 | 97色伦图片97色伦图影院久久 | 久久久久久久国产精品 | 国产视频在线一区 | 女人18毛片a级毛片免费 | 日韩一区二区三区不卡 | 日韩专区亚洲国产精品 | 精品国产区 | 国产亚洲午夜精品a一区二区 | 国产www网站 | 亚洲国产综合专区在线播一一 | 久久久久久网站 | 久草久草视频 | 天天干天天爽 | 久久久久国产成人精品亚洲午夜 | 国产亚洲综合一区在线 | 天天躁日日躁狠狠躁黑人躁 | 久久精品国产国语对白 | 在线看日本吃奶孕交 | 国产日韩欧美综合 | 国产福利专区精品视频 | 国产一区二区三区在线观看视频 | 一级在线 | 欧洲 | 视频一区在线免费观看 | 国产综合社区 | 四虎黄色网址 | aaa级毛片| 免费的黄色小视频 | 天天干天天操天天插 | 亚色91 | 国产伦精品一区二区三区在线观看 | 一级大片免费观看 |