条件满足:
1 当前对象本身(this)
2 以参量形式传入到当前对象方法中的对象
3 当前对象的实例变量直接引用的对象
4 当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友
5 当前对象所创建的对象
否则就不算"朋友" 代码需优化重构
不是“朋友”的例子:
public class SomeOne
{
public void operation(Friend friend)
{
Stranger stranger = friend.getStranger();
stranger.operation();
}
}
friend是SomeOne的朋友,但是在operation内部出现了stranger对象,它不是SomeOne的朋友,stranger.operation()方法应该挪到friend对象内部去,进行封装再对SomeOne提供。
这原则就是迪米特法则。
优点:降低系统内部的耦合度,若修改仅仅只会影响到这个类的“朋友”们,而不会影响到当前对象。
缺点:对象里会产生大量的小方法,这些方法仅仅只是传递间接的调用,因此与系统的业务逻辑无关,一个小方法内,可能仅仅只是调用了关联对象的其它方法,而且会使系统的不同模块之间不容易协调。
避免该缺点:使用依赖倒置原则,比如把上面的stranger做为抽象类,stranger.operation()是个抽象方法,通过friend.getStranger()动态返回不同具体的类,这样仍然做到了SomeOne对象不用修改,要改也只是friend.getStranger()方法内部返回不同的子对象即可,但是为了代码整洁度,清晰明了,直接一个friend.operation(),感觉还是挪走比较好。
23种模式里面:门面模式与中介者模式就是迪米特法则的应用
门面模式示意图: 显然Facade依赖各个子系统,子系统可以有多个,客户端直接与Facade打交道
中介者模式示意图:
posted on 2013-09-24 15:34
朔望魔刃 阅读(243)
评论(0) 编辑 收藏 所属分类:
设计模式&&数据结构