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 )模式