面向对象设计原则——单一职责原则,开放-封闭原则

SRP: 单一职责原则

内 聚性,一个类应该只有一个发生变化的原因。每个类应该只有一个职责,当需求变化时,该变化会反映为类的职责的变化。如果一个类承担类多于一个的职责,那么 引起变化的原因就会有多个,把这些职责耦合在一起,一个职责的变化可能会消弱或者一直这个类完成其他职责的能力。这种耦合,当变化发生时,设计会遭受到意 想不到的破坏。

定义职责,不一定要遵守这个规则。

分离耦合的职责

持久化, Employee 类包含了业务规则和对持久化的控制,职责耦合。 +store()

+CalculatePay() 应该分离。持久化类和业务逻辑,业务规则往往会频繁的变化,而持久化的方式却不会频繁变化,并且变化的原因也是不同的。把业务规则和持久化子系统绑定在一起的做法不好。

可以应用 Façade (外观), DAO (数据访问对象),或者 Proxy (代理)模式对设计进行重构。

OCP: 开放——封闭原则

软件实体(类,模块,函数)应该是可以扩展的,但是不可修改。

使用 OCP ,在程序中一处进行改动,就只需要添加新的代码,而不必改变已经正常运行的代码。不会导致连锁反应,导致一系列相关模块的改动。对模块的更改是通过增加新代码进行的,而不是更改现有代码。

遵循开放 - 封闭原则设计出的模块两个特征。

(1)  对于扩展是开放的( open to extension )模块的行为可以扩展,可以改变模块的功能,应用的需求改变时,可以对模块进行扩展,使其满足改变。

(2)  对于修改是封闭的( closed for modification )对模块行为进行扩展时,不必改动模块的源代码。

怎么做到 : 抽象?

创建出固定却能够描述一组任意个可能行为的抽象体,即抽象基类。

而这一组任意个可能行为则表现可能的派生类。

 

满足 OCP 常用的方法:一种是策略模式, 应用它们可以把一个功能的通用部分和实现细节部分清晰分离开来。

模块可能对抽象体进行操作。由于模块依赖于一个固定的抽象体,所以它对于更改可以是封闭的。同时,通过从这个抽象类派生,可以扩展此模块的行为。

Client 类使用 Server 类。如果我们希望 Client 对象使用另外一个不同的服务器对象,那么就必须要把 Client 类中使用 Server 类的地方更改为新的服务器类。

 

遵循 OCP 原则的设计

(采用 Strategy 模式)

 

Client 需要实现一些功能,它可以根据 ServerInterface 抽象接口去描绘那些功能。 ServerInterface 的子类型可以以任何它们所选择的方式去实现这个接口。这样就可以通过创建 ServerInterface 的新的子类型的方式去扩展,更改 Client 中指定的行为。

另一种是模板方法( Template Method )模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值