1、开闭原则
对修改关闭,对扩展打开。
2、里氏替换原则
子类继承父类的方法时,不可重写父类的方法。
如果重写了父类的方法会导致整个继承体系比较差,特别是运用多态比较平凡时,程序运行出错概率较大。
如果出现了违背“里氏替换原则”替换原则,需要重新设计类之间的关系。
3、依赖倒转原则
高层模块不应该依赖底层模块,两者应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。
核心思想:面相接口编程,不面向实现编程。
依赖倒置原则的实现方法依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则。
(1)每个类尽量提供接口或抽象类,或者两者都具备。
(2)变量的声明类型尽量是接口或者是抽象类。
(3)任何类都不应该从具体类派生。
(4)使用继承时尽量遵循里氏替换原则。
一个例子:
package principle;
public class DIPtest {
public static void main(String[] args) {
Customer wang = new Customer();
System.out.println("顾客购买以下商品:");
wang.shopping(new ShaoguanShop());
wang.shopping(new WuyuanShop());
}
}
//商店
interface Shop{
public String sell(); //卖
}
//韶关网店
class ShaoguanShop implements Shop {
public String sell(){
return "韶关土特产:香菇、木耳……";
}
}
//婺源网店
class WuyuanShop implements Shop{
public String sell(){
return "婺源土特产:绿茶、酒糟鱼……";
}
}
//顾客
class Customer{
public void shopping(Shop shop){ //购物
System.out.println(shop.sell());
}
}
4、单一职责原则(也适用于方法)
单一职责原则规定一个类有且仅有一个引起它变化的原因。
一个类承担了太多职责会有以下缺点:
(1)一个职责发生变化时可能会抑制或削弱其他职责
(2)当用户只需要类的每一个职责时又不得不把其他的职责引入进来,从而造成代码冗余。
单一职责的有点:
(1)降低类的复杂度,提高可读性。
(2)提高系统的可维护性
(3)引发风险变低
单一职责原则是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,再封装到不同的类或模块中。而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。
5、接口隔离原则
要为各个类建立他们需要的专用接口,而不是试图建立一个很庞大的接口共所有依赖的类使用。
6、迪米特法则
如果两个类无需直接通信,那么就不应该出现直接互相调用,可以通过第三方转发该调用。
只有当两个对象不存在关联,聚合和组合关系时就需要考虑使用迪米特法则。
使用这个法则会产生中介类,如果过多使用这个法则就会产生大量的中介类,会增加系统的复杂性。
用一个例子说明一下:
明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,其类图如图所示。
7、合成复用原则
该原则要求在软件开发过程中,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑继承关系来实现。如果要使用继承关系来实现,那么必须遵循里氏替换原则。
先看一个使用类继承的UML类图
使用了合成复用原则:
总结:
开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。