一、开闭原则(Open-Closed Principle, OCP)
对软件实体的改动,最好用扩展而非修改的方式,如果要修改代码,尽量用继承或组合来扩展类的功能,而不是直接修改代码。
二、里氏替换原则
尽量把父类设计成抽象类或者接口,让子类继承父类或实现父类接口,子类可以扩展父类的功能,但不能够改变父类原有的功能。
三、单一职责原则
一个类只承担一个职责。
四、接口隔离原则
接口最小化。接口中的方法尽量少,和单一职责类似
1)单一职责针对的是类
2)接口隔离针对的是接口
五、依赖倒置原则
面向接口/抽象类编程,而不是面向实现编程。
为什么使用依赖倒置原则,可以看该文章
http://t.zoukankan.com/mamxfx-p-7148067.html
六、迪米特法则
1)类向外公开的方法应该尽可能的少
2)依赖的对象尽可能的少(只依赖应该依赖的对象)
七、合成复用原则
尽量使用合成/聚合的方式,而不是使用继承。
七大设计原则之间的关系
开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段;
第一要明确,所有的原则都是为了实现面向对象设计的可扩展性,可复用性,可维护性而定义的。
一个已有的代码模块,为了实现可扩展性,需要对外保持开放;为了实现可复用性,需要保持独立(单一职责,高内聚,低耦合);为了实现可维护性,需要对内封闭(对已有代码模块不要进行修改)。
原文链接:https://blog.csdn.net/qq_23018459/article/details/95360480
问题:为什么不使用继承或使用合成复用?
这个问题的解答先了解什么是属性和字段
属性是面向对象语言中用来封装字段的外衣,它像是字段对外界的桥梁,我们可以通过属性来验证数据的合法性或控制对外的访问性等等。每个属性的背后都有其对应的一个字段做支撑,就算是自动属性,在编译时系统也会创建其字段,只不过自动属性是微软给我们的语法糖罢了。在C#中,属性最后是会编译成两个方法:get_属性名和set_属性名(如果是只读属性,则没有set方法,反之没有get方法)。 编译成方法,属性就不会占用太多空间,因为方法存在于内存公共的方法区,每个实例的创建不过是多一个指向该方法的指针。但是字段不一样,每个实例创建的创建,都会在内存中开辟对应的空间来存放字段,一个类中的字段越多,它在内存中占用的空间就越大。
链接:https://zhuanlan.zhihu.com/p/391554338
所以一般在需要使用该类的时候才进行实例化,本人觉得是”为什么不使用继承或使用合成复用的“一部分原因。其他原因可以一起讨论,感谢留言。