/**
*迪米特法则(高内聚原则)与依赖倒转原则(抽像层应用)的联合使用
* (此思想贯穿整个设计模式)
*出自<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();