开闭原则:对扩展开放,对修改关闭。
例子:咕泡课程:有java,前端,测试等等。每种课程有id,名称,价格。但是都不一样:新建一个抽象的接口Icouce,里面有三个方法,getid,getName,getPrice,新建一个javaCource,继承接口,重写三个方法。然后创建一个构造器。然后创建一个测试类,创建抽象接口的具体实现类,给属性赋值。然后就可以得到javaCouce的id,name,privce。 问题是现在课程可能会打折。所以就要创建一个javaDiscountCouse类在里面对price进行打折。这样就可以在获取折后价格的同时获取到原价了。
依赖倒置原则:
高层模块不应该依赖底层模块。两者都应该依赖其抽象。抽象应该依赖细节,细节应该依赖抽象。针对接口编程,不针对实现编程。 可以减少类之间的耦合性,提高系统的稳定性。提高代码的可阅读性和可维护性,可以降低修改程序造成的风险。
单一职责原则:
不要存在一个导致类变更的原因。一个类,接口,方法只负责一项职责。优点:降低类的耦合性,提高类的可阅读性,提高系统的可维护性,降低变更引起的风险。
接口隔离原则:
用多个单一的接口,而不是一个统一的接口。客户端不应该依赖不需要的接口。注意:一个类对应一个类的依赖应该建立在最小的接口上,建立单一的接口,不要建立庞大臃肿的解耦。尽量的细化接口,接口中的方法尽量的少。注意适度原则,一定要尽量的适度。
迪米特法则:
一个对象应该对其他对象保持最少的了解,又叫最少知道原则。尽量降低类和类之间的耦合。强调只和朋友交流,不和陌生人说话。朋友,出现在成员变量,方法的输入输出参数中的类为成员朋友类,出现在方法体内部的类不是朋友类。
里式替换原则:
如果每一个类型为T1的对象O1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。定义扩展:一个软件实体如果适用一个父类的话,那一定适用于其子类,所有引用父类的地方必须能透明的使用其子类对象,子类对象能够替换父类对象,而程序逻辑不变。
引申意义:子类可以扩展父类的功能,但是不能改变父类的功能。
含义1:子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
含义2:子类中可以增加自己特有的方法。
含义3:当子类的方法重载父类的方法时,方法的前置条件(即方法的输入,入参)要比父类的输入参数要宽松。
含义4:当子类的方法实现父类的方法时(重写,重载或实现抽象的方法),方法的后置条件(即方法的输出,返回值)要比父类更严格或相等。
合成,聚合复用原则:
尽量使用对象组合,聚合。而不是继承达到软件复用的目的。聚合has-a和组合contains-a 优点:可以是系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。