1. 面向对象设计原则概述
1.1 软件可维护性和可复用性
一个易于维护的系统就是复用率高的系统,但是实际上软件的可维护性和可复用性是两个独立的目标。
1.2 面向对象设计原则
1.2.1 单一职责原则
用于控制类的粒度大小。一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。
1.2.2 开闭原则
开闭原则是面向对象的可复用设计的一块基石,它是最重要的面向对象设计原则。也就是在设计一个模块时,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源码的情况下改变这个模块的行为。
1.2.3 里氏代换原则
开闭原则的核心是对系统进行抽象化,并且从抽象化导出具体化,
从抽象化到具体化的过程需要使用继承关系。
- 定义
所有引用基类的地方必须能透明地使用其子类的对象
1.2.4 依赖倒转原则
要针对接口编程,不要针对实现编程。
1. 类之间的耦合
- 零耦合
- 具体耦合关系
- 抽象耦合关系
2. 依赖注入
- 构造器注入
public interface AbstractBook{
public void view();
}
public interface AbstractReader{
public void read();
}
public class ConcreteBook implements AbstractBook{
public void view(){
...
}
}
public class ConcreteReader implements AbstractReader{
private AbstractBook book;
public ConcreteReader(AbstractBook book){
this.book = book;
}
public void read(){
book.view();
}
}
- 设置注入
public interface AbstractBook{
public void view();
}
public interface AbstractReader{
public void setBook(AbstractRerader book);
public void read();
}
public class ConcreteBook implements AbstractBook{
public void view(){
...
}
}
public class ConcreteReader implements AbstractReader{
private AbstractBook book;
public void setBook(AbstractBook book){
this.book = book;
}
public void read(){
book.view();
}
}
- 接口注入
public interface AbstractBook{
public void view();
}
public interface AbstractReader{
public void read(AbstractBook book);
}
public class ConcreteBook implements AbstractBook{
public void view(){
...
}
}
public class ConcreteReader implements AbstractReader{
public void read(AbstractBook book){
book.view();
}
}
1.2.5 接口隔离原则
客户端不需要依赖那些它不需要的接口
1.2.6 合成复用原则
尽量使用对象的组合,而不是使用继承来达成目的
1.2.7 迪米特法则
用于降低系统的耦合度,使类与类之间保持松散的耦合关系
- 不要和陌生人说话
- 只与你直接的朋友通信
- 每一个软件单位与其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位