迪米特原则

定义:

迪米特原则也叫最少知道原则,一个对象应该对其他对象保持最少的了解。

简单的说,就是如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用

迪米特法则还是在讲如何减少耦合的问题,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。也就是说,信息的隐藏促进了软件的复用。

只和朋友交流。迪米特还有一个英文解释叫做“Only talk to your immedate friends”,只和直接 的朋友通信,什么叫做直接的朋友呢?每个对象都必然会和其他对象有耦合关系,两个对象之间的耦合就 成为朋友关系,这种关系有很多比如组合、聚合、依赖等等。包括以下几类:

  1. 当前对象本身(this)
  2. 以参数形式传入到当前对象方法中的对象
  3. 当前对象的成员对象
  4. 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友
  5. 当前对象所创建的对象

举例说明:人买房子
房子类:

public class House {
    public void areas(){
        double area = 150.8;
        System.out.println("平米数:"+area);
    }
    public void decorations(){
        String decoration = "豪华装修";
        System.out.println("装修:"+decoration);
    }
    public void floors(){
        int floor = 16;
        System.out.println("楼层:"+floor);
    }

    public void property(){
        areas();
        decorations();
        floors();
    }
}
买房人的类
```java
public class Person {
    private House house;
    public void buyHouse(){
        house.floors();
        house.decorations();
        house.areas();
        house.property();
    }
}

这里买房的人直接见到房子属性了,买房的不知道自己该注意什么怎么办?所以不符合迪米特原则,下面改进:

房子类:

public class House {
    private void areas(){
        double area = 150.8;
        System.out.println("平米数:"+area);
    }
    private void decorations(){
        String decoration = "豪华装修";
        System.out.println("装修:"+decoration);
    }
    private void floors(){
        int floor = 16;
        System.out.println("楼层:"+floor);
    }

    public void property(){
        areas();
        decorations();
        floors();
    }
}

此时如图:
在这里插入图片描述
但是迪米特原则规则是减少耦合,只和朋友通讯,所以还要继续修改:
添加一个中介类:

public class Mediator {
    private House house;

    public void find(){
        house.property();
    }
}

然后人找中介买房:

public class Person {
    private Mediator mediator;
    public void buyHouse(){
        mediator.find();
    }
}

此时图解:
在这里插入图片描述
但是现在还有个问题,假如房子不卖了或者中介跑了怎么办?所以要加个保障,所以有了更好的方法来改造一下:
图解:
在这里插入图片描述
中介公司接口:

public interface IMediator {
    void find(IHouse house);
}

房源接口:

public interface IHouse {
    void property();
}

中介:

public class Mediator implements IMediator{

    @Override
    public void find(IHouse house){
        house.property();
    }
}

房子:

public class House implements IHouse{
    private void areas(){
        double area = 150.8;
        System.out.println("平米数:"+area);
    }
    private void decorations(){
        String decoration = "豪华装修";
        System.out.println("装修:"+decoration);
    }
    private void floors(){
        int floor = 16;
        System.out.println("楼层:"+floor);
    }

    @Override
    public void property(){
        areas();
        decorations();
        floors();
    }
}

人:

public class Person {
    public void buyHouse(){
        IMediator mediator = new Mediator();
        mediator.find(new House());
    }
}

来测试一下:


public class BuyHouse {
    public static void main(String[] args) {
        Person person = new Person();
        person.buyHouse();
    }
}

结果:
在这里插入图片描述
这次买房就没问题了,我们可以找中介公司,公司找中介,也可以找房子,很方便,很灵活,也应用到了依赖倒置原则!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值