单一职责和里氏替换
一、单一职责原则1.1 原则解读
该原则要求类的职责明确清晰,这样符合该原则的设计有如下好处:
原则上,我们只要将不同职责打包到不同的类中去,即可满足单一职责原则。然而,满足该原则的难处在于如何划分职责?,如何划分职责只能在具体场景中进行具体划分,不同的需求下,划分可能是不同的。 1.2 例1假设现在我们需要实现用户管理的功能,包括了用户的信息更改,增加机构,增加角色等等。为了维护用户的诸多信息,我们将这些写到一个接口当中,作为一个用户管理类。我们来看看类图: 这个接口设计的问题在于:用户的属性和用户的行为没有分开。违反了单一职责的原则。我们可以吧用户信息抽出来成为一个业务对象BO,把用户的行为抽取出来成为一个业务逻辑Biz。其中BO对象的职责就是收集和反馈用户的属性信息,而Biz对象的职责是负责用户的行为。此时类图如下所示: 这样把一个接口拆分成两个有什么好处呢?
1.3 例2单一职责的好处是不言而喻的,概念的定义也十分清晰明确。但是实现单一职责的首要前提是要会划分职责,而划分职责不是一项容易的工作。我们来看一个例子: 这是一个电话类。在电话通话的过程中,应该包含以下几个过程:
代码如下所示: class IPhone{
public:
void dial(String phoneNumber) = 0;
void chat(Object o) = 0;
void hangup() = 0;
}
这个类在直观上看非常合理,但是实际上已经违反了单一职责模式,因为该类负责了不止一个职责。它包含了两个职责:
协议管理包括的是
既然变化互不影响,也就是说这两组接口是相互独立的,所以我们可以考虑拆分成两个不同的类。现在拆分后的类图如下: 二、里氏替换原则2.1 原则解读
就是子类必须能够完全替代 父类,否则就是不合理的继承关系。 void doSth(Anaimal* A){
...
A->Fly;
...
}
int main(){
Dog *dog = new Dog;
doSth(dog);//错误,dog没有实现Fly
return 0;
}
这时候需要进一步优化,脱离继承关系,变成 飞行类动物和不会飞行的动物两个类,这两个类都继承动物类。并将 原动物类里的 方法 Fly 移动飞行类动物里,Run方法 还留在动物类里,而Dog 继承 不会飞行的动物那个 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |