面向对象设计的目标之一在于支持可维护性复用,一方面需要实现设计方案或者源码的重用,另一方面要确保系统能够易于扩展和修改,具有较好的灵活性。 常用的设计原则有七个原则:
1.单一职责原则(single responsibility principle,SPR)
一个类只负责一个功能领域中的相应职责。(或者可以定义为:就一个类而言,只有一个原因能够引起它变换)。
单一职责原则是实现高内聚、低耦合的指导方针,是最简单的也是最难运用的原则。
class Chart {
private String type;
public Chart(Object[][] data, String type) {
this.type = type;
if (type.equalsIgnoreCase("histogram")) {
//初始化柱状图
}else if (type.equalsIgnoreCase("pie")) {
//初始化饼状图
}else{
//初始化折线图
}
}
public void display(){
if (this.type.equalsIgnoreCase("histogram")) {
//显示柱状图
}else if (this.type.equalsIgnoreCase("pie")) {
//显示饼状图
}else{
//显示折线图
}
}
}
上面这个类的权责过重,将各种图标对象的初始化代码和显示放在同一个类中实现,就违反了单一职责原则。
2.开闭原则(Open-Close Principe,OCP)
一个软件实体应当对扩展开放,对修改关闭。即软件实体应该在尽量不修改原有代码的情况下进行扩展。
如果一个软件的设计符合开闭原则,那么就可以很方便地对系统进行扩展,而且在扩展的时候无需修改现有代码,是的软件系统拥有使用性和灵活性的同时具备较好的稳定性和延续性。
如Java中的接口、抽象类等机制,可以通过他们的抽象层,将不同的实现香味移至具体的实现层完成。
3.里氏替换原则(Liskov Substitution Principe,LSP)
所有引用父类的地方必须能够透明地使用期子类对象。
在一个软件系统中将一个父类对象替换成它的子类对象,程序将不会产生任何错误和异常,则满足里氏替换原则。
4.依赖倒转原则
抽象不应该依赖于细节,细节应该依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
5.接口隔离原则
使用多个专门的接口,而不是使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
例如下面的接口就不符合接口隔离原则,这个接口在实现类中不得不将所有的方法实现(客户端需要的和不需要的都需要实现,当然空方法也算实现)。
public interface Client {
// 从文件读取数据
void dataRead();
// 转换成XML格式
void transformToXML();
// 创建图表
void createChart();
// 显示图表
void displayChart();
// 创建文字报表
void createReport();
// 显示文字报表
void displayReport();
}
应该讲接口拆分成一下四个接口:
public interface DataHandler {
// 从文件读取数据
void dataRead();
}
public interface XMLTransformer {
// 转换成XML格式
void transformToXML();
}
public interface ChartHandler {
// 创建图表
void createChart();
// 显示图表
void displayChart();
}
public interface ReportHandler {
// 创建文字报表
void createReport();
// 显示文字报表
void displayReport();
}
6.合成复用原则(Composite Reuse Principe,CRP)
尽量使用对象的组合,而不是继承来达到复用的目的。
这个原则就是在一个新的对象中通过关联关系(组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分,尽量少用继承。
7.迪米特法则(Law of Demeter,LoD)
一个软件实体应当尽可能少地与其他实体发生相互作用。
迪米特法则要求在设计系统的时候,应该尽量减少对象之间的交互,如果两个对象之间不必彼此通信,那么两个对象就不应该发生任何直接的相互作用;如果其中一个对象需要调用另外一个对象的方法,可以通过第三者转发这个调用。简而言之,就是通过引入一合理的第三者来降低现有对象之间的耦合度。
原文地址:https://www.cnblogs.com/jpfss/p/9962428.html