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

面向?qū)ο笤O(shè)計(jì)原則

迪米特法則

前幾節(jié)分別詳細(xì)介紹了面向?qū)ο笤O(shè)計(jì)原則中的開閉原則、里氏替換原則、依賴倒置原則、單一職責(zé)原則和接口隔離原則,本節(jié)將詳細(xì)介紹迪米特法則。

迪米特法則的定義

迪米特法則(Law of Demeter,LoD)又叫作最少知識(shí)原則(Least Knowledge Principle,LKP),產(chǎn)生于 1987 年美國(guó)東北大學(xué)(Northeastern University)的一個(gè)名為迪米特(Demeter)的研究項(xiàng)目,由伊恩·荷蘭(Ian Holland)提出,被 UML 創(chuàng)始者之一的布奇(Booch)普及,后來(lái)又因?yàn)樵诮?jīng)典著作《程序員修煉之道》(The Pragmatic Programmer)提及而廣為人知。

迪米特法則的定義是:只與你的直接朋友交談,不跟“陌生人”說(shuō)話(Talk only to your immediate friends and not to strangers)。其含義是:如果兩個(gè)軟件實(shí)體無(wú)須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用,可以通過(guò)第三方轉(zhuǎn)發(fā)該調(diào)用。其目的是降低類之間的耦合度,提高模塊的相對(duì)獨(dú)立性。

迪米特法則中的“朋友”是指:當(dāng)前對(duì)象本身、當(dāng)前對(duì)象的成員對(duì)象、當(dāng)前對(duì)象所創(chuàng)建的對(duì)象、當(dāng)前對(duì)象的方法參數(shù)等,這些對(duì)象同當(dāng)前對(duì)象存在關(guān)聯(lián)、聚合或組合關(guān)系,可以直接訪問(wèn)這些對(duì)象的方法。

迪米特法則的優(yōu)點(diǎn)

迪米特法則要求限制軟件實(shí)體之間通信的寬度和深度,正確使用迪米特法則將有以下兩個(gè)優(yōu)點(diǎn)。

1. 降低了類之間的耦合度,提高了模塊的相對(duì)獨(dú)立性。

2. 由于親合度降低,從而提高了類的可復(fù)用率和系統(tǒng)的擴(kuò)展性。

但是,過(guò)度使用迪米特法則會(huì)使系統(tǒng)產(chǎn)生大量的中介類,從而增加系統(tǒng)的復(fù)雜性,使模塊之間的通信效率降低。所以,在釆用迪米特法則時(shí)需要反復(fù)權(quán)衡,確保高內(nèi)聚和低耦合的同時(shí),保證系統(tǒng)的結(jié)構(gòu)清晰。

迪米特法則的實(shí)現(xiàn)方法

從迪米特法則的定義和特點(diǎn)可知,它強(qiáng)調(diào)以下兩點(diǎn):

1. 從依賴者的角度來(lái)說(shuō),只依賴應(yīng)該依賴的對(duì)象。

2. 從被依賴者的角度說(shuō),只暴露應(yīng)該暴露的方法。

所以,在運(yùn)用迪米特法則時(shí)要注意以下 6 點(diǎn)。

1. 在類的劃分上,應(yīng)該創(chuàng)建弱耦合的類。類與類之間的耦合越弱,就越有利于實(shí)現(xiàn)可復(fù)用的目標(biāo)。

2. 在類的結(jié)構(gòu)設(shè)計(jì)上,盡量降低類成員的訪問(wèn)權(quán)限。

3. 在類的設(shè)計(jì)上,優(yōu)先考慮將一個(gè)類設(shè)置成不變類。

4. 在對(duì)其他類的引用上,將引用其他對(duì)象的次數(shù)降到最低。

5. 不暴露類的屬性成員,而應(yīng)該提供相應(yīng)的訪問(wèn)器(set 和 get 方法)。

6. 謹(jǐn)慎使用序列化(Serializable)功能。

【例1】明星與經(jīng)紀(jì)人的關(guān)系實(shí)例。

分析:明星由于全身心投入藝術(shù),所以許多日常事務(wù)由經(jīng)紀(jì)人負(fù)責(zé)處理,如與粉絲的見面會(huì),與媒體公司的業(yè)務(wù)洽淡等。這里的經(jīng)紀(jì)人是明星的朋友,而粉絲和媒體公司是陌生人,所以適合使用迪米特法則,其類圖如圖 1 所示。

圖1 明星與經(jīng)紀(jì)人的關(guān)系圖

程序代碼如下:

package principle;
public class LoDtest
{
    public static void main(String[] args)
    {
        Agent agent=new Agent();
        agent.setStar(new Star("林心如"));
        agent.setFans(new Fans("粉絲韓丞"));
        agent.setCompany(new Company("中國(guó)傳媒有限公司"));
        agent.meeting();
        agent.business();
    }
}
//經(jīng)紀(jì)人
class Agent
{
    private Star myStar;
    private Fans myFans;
    private Company myCompany;
    public void setStar(Star myStar)
    {
        this.myStar=myStar;
    }
    public void setFans(Fans myFans)
    {
        this.myFans=myFans;
    }
    public void setCompany(Company myCompany)
    {
        this.myCompany=myCompany;
    }
    public void meeting()
    {
        System.out.println(myFans.getName()+"與明星"+myStar.getName()+"見面了。");
    }
    public void business()
    {
        System.out.println(myCompany.getName()+"與明星"+myStar.getName()+"洽淡業(yè)務(wù)。");
    }
}
//明星
class Star
{
    private String name;
    Star(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
}
//粉絲
class Fans
{
    private String name;
    Fans(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
}
//媒體公司
class Company
{
    private String name;
    Company(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
}

程序的運(yùn)行結(jié)果如下:

粉絲韓丞與明星林心如見面了。
中國(guó)傳媒有限公司與明星林心如洽淡業(yè)務(wù)。

 

全部教程
主站蜘蛛池模板: 老司机永久免费网站在线观看 | 在线亚洲精品视频 | 欧美日韩亚洲一区二区 | 91久久综合九色综合欧美98 | se在线观看| 欧美日韩国产人成在线观看 | 亚洲午夜一区 | 欧美顶级毛片在线播放 | 波多野结衣中文一区二区免费 | 天天做天天爱天天爽综合网 | 天天操夜夜操夜夜操 | 亚洲专区区免费 | 免费超级淫片日本高清视频 | 国产高清一区二区三区视频 | 国产成人精品久久亚洲高清不卡 | 午夜视频网站 | 欧美成人在线观看 | 精品亚洲一区二区三区 | 日韩精品视频观看 | 久青草视频免费观看青 | 国产成人亚洲日本精品 | 羞羞网站在线看 | 日本岛国片在线观看 | 四虎永久免费最新在线 | 亚洲国产另类久久久精品小说 | 色婷婷5月精品久久久久 | 五月激激| 国产伦精品一区二区三区免费观看 | 亚洲六月丁香色婷婷综合久久 | 久久亚洲一级毛片 | 嫩草影院麻豆久久视频 | 97国产在线公开免费观看 | 全免费午夜一级毛片真人 | 理论片 我不卡影院 | 天天干人人干 | 爱操视频在线观看 | 青青国产成人久久91 | 亚洲欧美另类视频 | 久久精品国产免费看久久精品 | 91长腿女神清纯大又嫩在线 | 一区二区三区在线 |