- 找到系统中变化的部分,将变化的部分同其它稳定的部分隔开。
- 面向接口编程,而不要面向实现编程。
- 优先使用对象组合,而非类继承。
- 软件实体应当对扩展开放,对修改关闭。
- 继承必须确保超类所拥有的性质在子类中仍然成立。
以下内容均来自互联网:
-
**Identify the aspects of your application that vary and separate them from what stays the same.(找到系统中变化的部分,将变化的部分同其它稳定的部分隔开。)**换句话说就是:“找到变化并且把它封装起来,稍后你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分。” 尽管这个概念很简单,但是它几乎是所有设计模式的基础,所有模式都提供了使系统里变化的部分独立于其它部分的方法。
-
Program to an interface, not an implementation.(面向接口编程,而不要面向实现编程。)“接口”这个词已经被赋予太多的含义,搞的大家一说点儿屁事就满嘴往外蹦“接口”。那么它到底是什么意思呢?我们这里说的接口是一个抽象的概念,不局限于语言层面的接口(例如C#里的interface)。一个接口也可以是一个抽象类,或者一个基类也可以看作是一种接口的表现形式,因为基类变量可以用来引用其子类。要点在于,我们在面向接口编程的时候,可以使用多态,那么实际运行的代码只依赖于具体的接口(interface,抽象类,基类),而不管这些接口提供的功能是如何实现的,也就是说,接口将系统的不同部分隔离开来,同时又将它们连接在一起。
-
**Favor composition over inheritance.(优先使用对象组合,而非类继承)**关于组合和继承,我们只要这样来理解即可:组合是一种“HAS-A”关系,而继承是一种“IS-A”关系。很明显“HAS-A”要比“IS-A”更灵活一些。也就是说在创建系统的时候,我们应该优先使用对象组合,因为它不仅可以给你提供更多灵活性和扩展性,而且还使你可以在运行时改变行为(组合不同的对象),这简直是酷毙了!但是也不是说继承就是不能用,只是说应该把继承应用在相对更稳定,几乎没有变化的地方,例如前面的Duck类里的Swim()方法,因为可以肯定所有鸭子一定都会游泳,所以就没有必要给这个行为提供基于Strategy模式的实现方式,因为那样做除了是程序更复杂以外,没有什么意义。
-
**Software entities should be open for extension,but closed for modification(软件实体应当对扩展开放,对修改关闭)**具体是策略模式。
-
**Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.(继承必须确保超类所拥有的性质在子类中仍然成立)**也就是说,当一个子类的实例应该能够替换任何其超类(父类)的实例时,它们之间才具有is-A关系。