这是我参与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了,所以是不可以分开的
}
如果只是为了使用方法,就没必要继承