Java与模式阅读笔记(1)依赖倒转原则

依赖倒转原则(DIP)—Dependence Inversion Principle

传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块:抽象层次依赖于具体层次。倒转原则是要把这个错误的依赖关系倒转过来,这就是“依赖倒转原则”的由来。

什么是依赖倒转原则

依赖倒转原则要求客户端依赖于抽象耦合。依赖倒转原则的表述为:

抽象不应当依赖于细节;细节应当依赖于抽象。(Abstractions should not depend upon details.Details should depend upon abstractions)

另一种表述为:

要针对接口编程,不要针对实现编程。(Program to an interface. not an implementation)

三种耦合关系

  • 零耦合(Nil Coupling)关系:如果两个类没有耦合关系,就称之为零耦合。
  • 具体耦合(Concrete Coupling)关系:具体性耦合会发生在两个具体的(可实现优化的)类之间,经由一个类对另一个具体类的直接引用造成。
  • 抽象耦合(Abstract Coupling)关系:抽象耦合关系发生在一个具体类和一个抽象类(或者接口)之间,使两个必须发生关系的类之间存有最大的灵活性

变量的静态类型和真实类型

变量被声明时的类型叫做变量的静态类型(Static Type)

变量所引用的对象的真实类型叫做变量的实际类型(Actual Type)

例如:

List foo = new Vector();

其中foo变量的静态类型是List实际类型是Vector。

根据依赖倒转原则,在声明一个java类的时候要使用接口或抽象作为静态类型而不要用具体类来作为变量的静态类型。

Java对象的创建

使用Java语言创建对象的时候会用到new关键字以及这个类本身,对象被创建后才可以使用对象的抽象来引用它,可见Java语言创建一个对象的过程是违背依赖倒转原则的。

引入设计模式改造Java对象创建

  • 工厂方法模式
  • 模板方法模式
  • 迭代子模式

使用接口与抽象类的优缺点

1、抽象类可以提供某些方法的部分实现,而接口不可以有具体实现。换言之对于抽象类而言可向一个抽象类中随意的增加一个新的具体方法,其子类型都可以得到该具体方法,而对于接口则做不到这一点。如果向一个接口加入一个新的方法的话,所有实现这个接口的子类将无法通过编译,因为他们没有实现这个新生命的方法。

2、一个抽象类只能由它的子类来实现,这样其子类就不能再继承其他的父类了。而对于Java接口而言,任何一个实现了一个Java接口的类都可以具有这个接口的类型,而一个类可以实现任意多个接口。

3、从代码重构的角度来看,从一个具体的Java类来构建一个Java接口要容易的多。而从一个类构造一个抽象类要相对复杂的多,因为我们必须要一级一级的找到这个类型等级结构的最上面的那个超类,使这个超类再继承自这个抽象类才能完成构建。

4、通过Java接口我们可以定义混合类型(Mixin Type),一个混合类型表名一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。

综上,在实际的使用中我们要结合使用接口与抽象类。

原文地址:https://www.cnblogs.com/chinareny2k/p/1640588.html