设计模式学习笔记——迪米特法则

迪米特法则是针对类之间的低耦合而提出的,它要求一个类应该对自己需要耦合或者调用的类知道的最少,即被耦合或调用的类的内部如何复杂,跟本类没有一点关系,本类就知道你提供给我多少public方法,本类就调用这些方法,其他的你不要让我知道。

这个法则有以下基层含义:

1、只和朋友类交流

什么是朋友类呢?即和自己相耦合的类。既然相耦合,那么肯定是这两个耦合的类之间要存在交互,那些不存在交互的,却耦合到了一起,这就不叫做朋友类,这也是设计的缺陷,不交互却耦合到了一起,可想而知,这样的设计维护性是很差的,应该尽量避免这样的设计。

2、朋友类间也是有间距的

即相耦合的类之间不能过于亲密,提供给我那么多public方法,让我欢喜让我忧啊。相耦合的类应该彼此知道的最少,用最少的方法提供给我需要的功能就可以了,这样一来,类间的耦合程度就降低了很多,不管是维护起来还是理解起来,都是比较容易的。下面举个例子:

在安装软件的时候,会有一个导向动作,第一步干什么,第二步干什么,其类图如下:


代码如下:

public class Wizard {
	private Random rand=new Random(System.currentTimeMillis());
	
	public int first(){
		System.out.println("第一步...");
		return rand.nextInt(100);
	}
	
	public int second(){
		System.out.println("第二步...");
		return rand.nextInt(100);
	}
	
	public int third(){
		System.out.println("第三步...");
		return rand.nextInt(100);
	}
}
public class InstallSoftware {
	public void installSoftware(Wizard wizard){
		int first=wizard.first();
		if(first>50){
			int second=wizard.second();
			if(second>50){
				int third=wizard.third();
				if(third>50){
					wizard.first();
				}
			}
		}
	}
}
public class Client {
	public static void main(String[] args) {
		InstallSoftware invoker=new InstallSoftware();
		invoker.installSoftware(new Wizard());
	}
}
我们看一下这样的设计有什么问题,Wizard类暴露给InstallSoftware类太多的方法,在installSoftware()方法中,用了Wizard提供的所有的public方法,这样的耦合度是不是有些太高了?假如说要将返回值从int修改为boolean,那么除了修改Wizard类外,还要大幅度修改InstallSoftware类,这样修改的风险就大大提高了啊,显然这不是一个好的设计,那么我们来看一看应用迪米特法则之后,改进的类图:

改进之后的代码:

public class Wizard {
	private Random rand=new Random(System.currentTimeMillis());
	
	private int first(){
		System.out.println("第一步...");
		return rand.nextInt(100);
	}
	
	private int second(){
		System.out.println("第二步...");
		return rand.nextInt(100);
	}
	
	private int third(){
		System.out.println("第三步...");
		return rand.nextInt(100);
	}
	
	public void installWizard(){
		int first=first();
		if(first>50){
			int second=second();
			if(second>50){
				int third=third();
				if(third>50){
					first();
				}
			}
		}
	}
}
public class InstallSoftware {
	public void installSoftware(Wizard wizard){
		wizard.installWizard();
	}
}
场景类不变,在Wizard类中新增了一个public的installWizard()方法,在本类内部对安装过程进行了封装,并且设置为公开的,而其他的方法都设置为私有的,即这个Wizard类对外只提供了installWizard()这个方法,在InstallSoftware类中,通过Wizard对象只调用这个方法,就可以实现功能,这样一来,类间的耦合度就降低了很多,若是要修改Wizard类中的返回值,影响的也只是Wizard类本身,其他的类不受影响,这就显示了类的高内聚特性。


小结:

一个类公开的public方法或是属性越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。

迪米特法则的核心就是类间的解耦,弱耦合,只有弱耦合以后,类的复用率才可用提高。



1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值