在软件设计过程中,遵循面向对象的五大原则——SOLID,可提高软件健壮性和稳定性。
它们分别指的是:
1.单一责任原则(SRP)
2.开放-封闭原则(OCP)
3.Liskov替换原则(LSP)
4.接口隔离原则(ISP)
5.依赖转置原则(DIP)
文章目录
一、单一责任原则(SRP)
单一责任原则是指单一的类或模块只负责单一功能。
如果一个类包含了多个责任,那么将引起不良后果:
- 引入额外的包,占据资源
- 导致频繁的重新配置、部署等
应将其按功能进行拆分。
二、开放-封闭原则(OCP)
开放-封闭原则包含两部分内容:
1.对扩展性的开放
模块的行为应该是可扩展的,从而该模块可表现出新的行为以满足需求变化。
2.对修改的封闭
模块自身的代码是不应被修改的,
扩展模块的行为的一般途径是修改模块的内部实现,
如果一个模块不能被修改,那么它通常被认为是具有固定的行为。
关键:抽象技术
对抽象的类(抽象类/接口)产生依赖,而不是对具体的类产生依赖。
三、Liskov替换原则(LSP)
LSP原则的核心思想是指:子类型必须能够替换其基类型,派生类必须能通过基类的接口使用,客户端无需了解二者之间的差异。
对于Liskov替换原则的具体介绍与应用,详见我之前的文章Liskov替换原则
四、接口隔离原则(ISP)
不能强迫客户端依赖于它们不需要的接口:只提供必须的接口。
在创造接口时,尽可能创造多个专门的接口,而不是一个包含多功能的总接口。
例如:
以下这个结构中,RobotWorker类中必须被强制实现它所不需要eat方法,这种接口定义方式是不好的。
interface Worker{
void work();
void eat();
}
ManWorker implements Worker{
void work(){...};
void eat(){...};
}
RobotWorker implements Worker{
void work(){...};
void eat(){//Not Appliciable for a RobotWorker};
}
应将接口优化为以下形式:
interface Workable{
public void work();
}
interface Feedable{
public void eat();
}
ManWorker implements Workable,Feedable{
void work(){...};
void eat(){...};
}
RobotWorker implements Workable{
void work(){...};
}
五、依赖转置原则(DIP)
抽象的模块不应依赖于具体的模块,具体应依赖于抽象。
例如:
以下这个结构中,都是直接调用具体方法,并没有具体依赖于抽象。
void Copy(OutputStream dev){
int c;
while((c = ReadKeyboard())!= EOF)
if (dev == printer)
writeToPrinter(c);
else
wriyeToDisk(c);
}
应将优化为以下形式:
interface Reader{
public int read();
}
interface Writer{
public int write(c);
}
class Copy{
void Copy(Reader r, Writer w){
int c;
while (c = r.read() != EOF)
w.write(c);
}
}
总结
以上就是本篇文章要讲的内容,本文讲解了面向对象的五大设计原则SOLID,包括其基本内涵、操作方法和具体实例。