一、面向对象的设计原则
1. 单一职责原则
一个类只负责一个功能领域中的相应指责,就一个类而言,应该只有一个引起它变化的原因。在软件系统中,一个类承担的职责越多,被复用的可能性就越小,而且一个类承担的职责越多,就相当于这些职责藕合在一起,当一个职责变化时,就会影响到其他职责的运作。
单一职责原则是实现高内聚、低耦合的方针,需要发现类的不同职责并将其分离。
1.1 案例分析
如图1-1 中,Market超市类承担过多的职责,既包括业务类的促销活动promotion()和售卖sale()方法,又包含了文件操作类的报表导出exportFile()方法。如果有其他类需要使用报表导出功能,将无法重用。违背了单一职责原则。
用单一职责原则对Market类做出改造:
(1)FileUtil:负责操作文件;
(2)CustomerService:负责同一类业务的集中处理;
(3)Market:负责自身的销售与促销。
2. 开闭原则
一个软件实体应当队扩展开放,对修改关闭,即软件实体应该尽量不在修改原有代码的情况下进行扩展。为了满足开闭原则,需要队系统进行抽象化设计,抽象化是开闭原则的关键。常见的做法是为系统定义一个稳定的抽象接口、抽象类,再通过具体类来进行扩展,无须对抽象层进行修改,只需要增加新的实现类即可完成扩展,达到开闭原则的要求。
2.1 案例分析
如图2-1,一个人Person对于四季穿衣的不同,依赖于季节的种类,Person类dress()方法部分代码如下:
... ...
if ( season.equals("spring")){
Spring spring = new Spring();
spring.dress();
} else if ( season.equals("summer)){
Summer summer = new Summer();
summer.dress();
} else if ( season.equals("Autumn")){
Autumn autumn = new Autumn();
autumn.dress();
} else {
Winter winter = new Winter();
winter.dress();
}
... ...
如果需要增加一个季节,或者增加其他场合的穿衣场景,则需要修改Person类的dress()方法,违背了开闭原则。
针对开闭原则进行改造,如下:
(1)引入抽象类AbstractOccasion,将具体的场景作为AbstractOccasion的子类;
(2)PersonDress针对不同场景的穿衣进行操作(在PersonDress中调用occasion对象的dress()方法),具体场景由客户端选择。