面向对象设计基础原则(下)

214 阅读2分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

前言

承接上文,我们讲一下迪米特与合成复用原则

迪米特法则(最少知道原则)

降低程序之间的耦合度,一个类对自己依赖的类知道的越少越好

只跟你的直接朋友交谈,不跟陌生人说话。例子:A和B沟通是朋友,B跟C是朋友,但是A跟C不是朋友,所以需要B转交,而不要直接A跟C沟通,朋友就相当于对象, 用第三方转发。这个有个弊端就是中介类会非常多

迪米特法则只是要求降低类或对象之间耦合关系,并不是要求完全没有依赖关系

把自己的功能包装在自己的类中,对外提供方法调用,这是内聚

这是不遵守迪米特法则的,尽量不要出现下面方法m3的写法:

m1 m2 和成员变量b都是A类的直接朋友

m3里面的b不是A的直接朋友,属于陌生朋友,陌生类

/**
 * <p>
 * 迪米特法则
 * </p>
 *
 * @author MouthMouth
 * @since 2021/4/20
 */
public class A {
​
    /**
      *这是遵守迪米特法则的
      */
    private B b;  //作为A的一个成员变量是可以的

    public void m1(B b){
        //作为A的方法参数也是可以的
    }
​
    public B m2(){
        // 作为一个方法的返回参数也是可以的
        return null;
    }
​
    /**
     *这是不遵守迪米特法则的
     */
    public void m3(){
        B b = new B();  //这个B 对于A来说是个陌生类
    }
}
​

合成复用原则

尽量先使用组合或者聚合等关联关系实现,其次才考虑使用继承关系来实现

如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。

使用继承之前先考虑下面的能否实现:

聚合:整体与部分可以分开

public class Test(){
    A a;
    public void setA(A a){
        this.a = a;
    }
}

组合:整体与部分不可以分开

public class Test(){
    A a = new A; //在Test生成的时候就有A了,所以是不可以分开的
}

如果只是为了使用方法,就没必要继承