建网站logo怎么做,电子商务网站案例分析,网上书店网站建设规划书,wordpress域名展示开一个小专题——详细总结一下软件设计模式原则#xff0c;这部分在《软计》和《java设计模式》中算是很重要的知识点#xff0c;值得展开详细讲解一下~首先介绍的是【迪米特法则】 一.定义
迪米特法则又称为最少知识原则#xff0c;其定义为#xff1a;一个软件实体应当尽…开一个小专题——详细总结一下软件设计模式原则这部分在《软计》和《java设计模式》中算是很重要的知识点值得展开详细讲解一下~首先介绍的是【迪米特法则】 一.定义
迪米特法则又称为最少知识原则其定义为一个软件实体应当尽可能少的与其他实体发生相互作用。 一个软件实体应当尽可能少的与其他实体发生相互作用每一个软件单位对其他的单位都只有最少的知识而且局限于那些与本单位密切相关的软件单位。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖因此很容易使得系统的功能模块功能独立相互之间不存在或很少有依赖关系。迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系也希望能通过它的友元类来转达。因此应用迪米特法则有可能造成的一个后果就是系统中存在大量的中介类这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
英文缩写为LOD 如果两个软件实体无须直接通信那么就不应当发生直接的相互调用可以通过第三方转发该调用。其目的是降低类之间的耦合度提高模块的相对独立性。 二.描述
如果一个系统满足迪米特法则那么当其中一个软件实体发生变化时就会尽量少的影响其他软件实体扩展会相对容易这是对软件实体之间通信的限制迪米特法则要求限制软件实体之间通信的宽度和深度。
迪米特法则还有几种定义形式包括不要和陌生人说话、只与你的直接朋友通信在迪米特法则中对于一个对象其朋友包括以下几类
当前对象本身(this)以参数形式传入到当前对象方法中的对象当前对象的成员对象如果当前对象的成员对象是一个集合那么集合中的元素也都是朋友。当前对象创建的对象
任何一个对象如果满足上面的条件之一就是当前对象的“朋友”否则就是“陌生人”。在应用迪米特法则时一个对象只能与直接朋友发生交互不能与“陌生人”发生直接交互好处在于降低耦合~
迪米特法则要求我们在设计系统时应该尽量减少对象之间的交互如果两个对象不必直接通信那么这两个对象就不应该发生任何直接的相互作用如果其中一个对象需要调用另外一个对象的某个方法时可以通过【友元类】转发这个调用。
在迪米特法则运用到系统设计中时要注意以下几点
在类的划分上应该尽可能的创建松耦合的类类之间的耦合度越低复用率越高一个松耦合的类发生修改不会对关联的类造成太大的影响。在类的结构设计上每一个类都应当尽可能的降低其成员变量和成员方法的访问权限。在类的设计上只要有可能一个类型应当设计成不变类。在对其他类的引用上一个对象对其他对象的引用应该降到最低。
三.案例
假设现在有一段时间需要你学习某些内容有代码如下
public class Time{public void studyMath() {// do something}public void studyChinese() {// do something}public void studyEnglish() {// do something}public void study() {studyEnglish();studyChinese();studyMath();}
}public class Person {private Time time;public void Now() {// 学习什么都可以// 但是你发现Study类所有的方法都是公开的, 现在不知道该先学习哪个time.studyMath();time.study();//也可以是time.studyMath();time.studyEnglish();}
}
上述代码违背了迪米特原则即对于对象time此时不知道该学习什么——有多个方法可以调用~
学一门还是三门都学
如果改为如下的样式则正确
public class Time{private void studyMath() {// do something}private void studyChinese() {// do something}private void studyEnglish() {// do something}public void study() {studyEnglish();studyChinese();studyMath();}
}public class Person {private Time time;public void Now() {// 学习什么都可以// 但是你发现Study类所有的方法都是公开的, 现在不知道该先学习哪个time.studyMath();time.study();//也可以是time.studyMath();time.studyEnglish();}
}总结就是一句话——尽可能降低现有的耦合避免直接调用。