设计模式(一)—— 单一职责原则与开闭原则

一、面向对象的设计原则

1. 单一职责原则

        一个类只负责一个功能领域中的相应指责,就一个类而言,应该只有一个引起它变化的原因。在软件系统中,一个类承担的职责越多,被复用的可能性就越小,而且一个类承担的职责越多,就相当于这些职责藕合在一起,当一个职责变化时,就会影响到其他职责的运作。

        单一职责原则是实现高内聚、低耦合的方针,需要发现类的不同职责并将其分离。

1.1 案例分析


图 1-1

        如图1-1 中,Market超市类承担过多的职责,既包括业务类的促销活动promotion()和售卖sale()方法,又包含了文件操作类的报表导出exportFile()方法。如果有其他类需要使用报表导出功能,将无法重用。违背了单一职责原则。

        用单一职责原则对Market类做出改造:

图 1-2

        (1)FileUtil:负责操作文件;

        (2)CustomerService:负责同一类业务的集中处理;

        (3)Market:负责自身的销售与促销。

2. 开闭原则

        一个软件实体应当队扩展开放,对修改关闭,即软件实体应该尽量不在修改原有代码的情况下进行扩展。为了满足开闭原则,需要队系统进行抽象化设计,抽象化是开闭原则的关键。常见的做法是为系统定义一个稳定的抽象接口、抽象类,再通过具体类来进行扩展,无须对抽象层进行修改,只需要增加新的实现类即可完成扩展,达到开闭原则的要求。

2.1 案例分析


图 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()方法,违背了开闭原则。

        针对开闭原则进行改造,如下:

图 2-2

        (1)引入抽象类AbstractOccasion,将具体的场景作为AbstractOccasion的子类;

        (2)PersonDress针对不同场景的穿衣进行操作(在PersonDress中调用occasion对象的dress()方法),具体场景由客户端选择。


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容