创建软件应用程序是为了满足不断变化和发展的需求。一个成功的应用程序还应该提供一种简单的方法来扩展它以满足不断变化的期望。有一些问题已经被开发人员所发现并总结了解决方案。如果在设计和开发软件时应用一组面向对象的设计原则和模式,则可以避免或解决这些常见问题。
单一职责原则
单一职责原则是一种面向对象的设计原则,该原则指出软件模块应该只有一个被修改的理由。在大多数情况下,编写Java代码时都会将单一职责原则应用于类。
简单的说就是一个方法只解决一个问题,一个累只干相同的事情。不能说我这个方法是计算物体面积的然后我返回它的价格。同样一个猫的类Cat,里面不会产生“汪汪叫”的方法,因为不符合逻辑。这样的好处是,修改代码的时候,我只需要针对不同的方法进行修改,不用去动别的逻辑,而且我这样修改后还不影响整体的性能。单一职责的原则的好处就在于此。
开闭原则
含义:“模块、类和函数应该对扩展开放,对修改关闭。”
也即是说,一旦我们完成了代码的一部分,不应该再修改它,而是应该在它的基础之上继续建设。
不仅要测试正在改变的功能,还要测试它负责的整个功能。这其实就是说,我们在开发一个方法类的时候,对之前已经开发好的功能,不要修改。在已经开发好的基础上进行拓展。所谓的开指的就是拓展,所谓的闭就是已经开发好的代码。
里氏替换原则
Barbara Liskov指出,派生类型必须完全可替代其基类型。里氏替换原则(LSP)与子类型多态密切相关。基于面向对象语言中的子类型多态,派生对象可以用其父类型替换。例如,如果有一个Car对象,它可以在代码中用作Vehicle。里氏替换原则声明,在设计模块和类时,必须确保派生类型从行为的角度来看是可替代的。当派生类型被其父类型替换时,其余代码就像它是子类型那样使用它。从这个角度来看,派生类型应该像其父类型那样表现,不应该破坏它的行为。这称为强行为子类型。(理解起来有点难度,好像没有什么鸟用)
接口隔离原则
“客户端不应该依赖于它所不需要的接口。”实际应用中,接口隔离原则(Interface Segregation Principle,ISP)减少了代码耦合,使软件更健壮,更易于维护和扩展。接口隔离原则最初是由Robert Martin提出的,他意识到如果接口隔离原则被破坏,客户端被迫依赖它们不使用的接口时,代码就会变得紧密耦合,几乎不可能为其添加新功能。(同样不好理解,意思是我继承的接口要根据我实际的需要来,不要搞一大堆我不需要的方法)
依赖倒置原则
为了理解这个原理,我们必须解释耦合和解耦的重要概念。耦合是指软件系统的模块彼此依赖的程度。依赖度越低,维护和扩展系统就越容易。有不同的方法来解耦系统的组件。其中一个办法是将高级逻辑与低级模块分开,如图1-16所示。这样做时,可以尝试让它们都依赖于抽象进而减少二者之间的依赖关系。如此就可以替换或扩展其中任何一个模块而不影响其他模块。
设计模式结构图:
设计模式之间的关系