面向对象7大设计原则(五)------ 迪米特法则

面向对象设计原则之迪米特法则

一、什么是迪米特法则

定义:一个软件实体应当尽可能少地与其他实体发生相互作用。

迪米特法则还有几种定义形式,包括:不要和“陌生人”说话、只与你的直接朋友通信等,在迪米特法则中,对于一个对象,其朋友包括以下几类:
(1)当前对象本身(this);
(2)以参数形式传入到当前对象方法中的对象;
(3)当前对象的成员对象;
(4)如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
(5)当前对象所创建的对象。

任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。在应用迪米特法则时,一个对象只能与直接朋友发生交互,不要与“陌生人”发生直接交互,这样做可以降低系统的耦合度,一个对象的改变不会给太多其他对象带来影响。

迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。

二、实例

用代码实现用手机听音乐的过程:

错误的写法

public class Song {
    private String songName;

    public Song(String songName) {
        this.songName = songName;
    }

    public String getSongName() {
        return songName;
    }

    public void setSongName(String songName) {
        this.songName = songName;
    }
}
public class MusicApp {

    public void listen(Song song){
        System.out.println(song.getSongName());
    }
}
public class Phone {
    private MusicApp musicApp = new MusicApp();
	private Song song = new Song("一曲相思");
    public void listenToMusic(){
        musicApp.listen(song);
    }
}
public class RunTest {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.listenToMusic();
    }
}

上述代码虽然完成了手机听音乐的功能,但是逻辑不正确,我们打开手机时是没有歌曲的,只有打,打开音乐软件时才可以听歌,没有音乐软件是没办法听歌的。所以,手机和歌曲半毛钱关系都没有,歌曲不应该在手机里。正确的设计应该是:手机里有音乐软件,音乐软件里有歌曲。手机和音乐软件是朋友,音乐软件和歌曲是朋友,手机和歌曲不是朋友,所以它们不应该有交集。

正确写法

public class Song {
    private String songName;

    public Song(String songName) {
        this.songName = songName;
    }

    public String getSongName() {
        return songName;
    }

    public void setSongName(String songName) {
        this.songName = songName;
    }
}
public class MusicApp {
    private Song song = new Song("一曲相思");

    public void listen(){
        System.out.println(song.getSongName());
    }
}
public class Phone {
    private MusicApp musicApp = new MusicApp();

    public void listenToMusic(){
        musicApp.listen();
    }
}
public class RunTest {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.listenToMusic();
    }
}

三、总结

在将迪米特法则运用到系统设计中时,要注意下面的几点:在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此的确可以降低耦合关系。但是凡事都有度,虽然可以避免与非直接的类通信,但是要通信,必然会通过一个“中介”来发生联系。过分的使用迪米特原则,会产生大量这样的中介和传递类,导致系统复杂度变大。所以在采用迪米特法则时要反复权衡,既做到结构清晰,又要高内聚低耦合。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值