迪米特法则与依赖倒转原则的简单分析 (转载)

/**
 *迪米特法则(高内聚原则)与依赖倒转原则(抽像层应用)的联合使用
 *    (此思想贯穿整个设计模式)
 *出自<JAVA与模式>一书.
 *代码及注解:若非轻寒
 *注:张三李四是朋友关系,李四王五是朋友关系.张三和王五是陌生人关系
 *为了保证张三和王五不认识,而张三又能调用王五中的方法
 *通过一个李四作为中继,把张三和王五隔离开来
先看看 他的UML图

 */

public interface AbstractStranger  //抽像的,陌生人;
{
 abstract void operation3();
}
//---------------------------------
public class Someone   //某人;(张三)
{
 public void operation1(Friend friend)
 {
  AbstractStranger stranger = friend.provide();    //里氏代换;
  stranger.operation3();
 }
}
//---------------------------------
public class Friend    //朋友;(李四)
{
 private AbstractStranger stranger = new Stranger();
 public void operation2()
 {
  System.out.println("operation2");
 }
 public AbstractStranger provide()
 {
  return stranger;
 }
}
//---------------------------------
public class Stranger implements AbstractStranger
{            //陌生人(王五);
 public void operation3()
 {
  System.out.println("operation3");
 }
}


依赖倒转原则:要依赖于抽象,不要依赖于具体。

8.3 依赖倒转原则
三种耦合关系:
1)零耦合
2)具体耦合:发生在两个具体的(可实例化的)类之间。
3)抽象耦合:发生在一个具体类和一个抽象类(或者Java接口)之间。

what?
抽象不应当依赖于细节;细节应当依赖于抽象。

另一种表述:
要针对接口编程,不要针对实现编程。
一个具体Java类应当只实现Java接口和抽象Java类中声明过的方法,而不应当给出多余的方法。

变量的静态类型:变量被声明时的类型。
变量的真实类型:变量所引用的对象的真实类型。

引用对象的抽象类型
在很多情况下,一个Java程序需要引用一个对象。这个时候,如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为变量的静态类型。这就是针对接口编程的含义。
例如:蛋 x = new 鸡();
而非:鸡 x = new 鸡();

List employees = new Vector();
而非:Vector employees = new Vector();

posted @ 2008-04-16 09:39  雨中漫步的太阳  阅读(746)  评论(0编辑  收藏  举报