单一职责原则:一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分.
一个对象承担了太多的职责的缺点:
代码语言:javascript复制一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;
当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费
核心思想:控制类的粒度大小、将对象解耦、提高其内聚性。
优点优势:
代码语言:javascript复制 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多。
提高类的可读性。复杂性降低,自然其可读性会提高。
提高系统的可维护性。可读性提高,那自然更容易维护了。
变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响。
实现方法:设计人员发现类的不同职责并将其分离,再封装到不同的类或模块。
应用举例:
小码路是一个不听话的孩子,在家需要爸爸妈妈辅导作业
代码语言:javascript复制class Work
{
public:
string HomeWork(string _work){return _work;}
string BB(string _work){return HomeWork(_work) "爸爸做";}
string MM(string _work){return HomeWork(_work) "妈妈做";}
};
于是爸爸妈妈开始辅导作业.
代码语言:javascript复制int main()
{
Work *_work=new Work();
cout<<_work->BB("辅导作业")<<endl;
cout<<_work->MM("辅导作业")<<endl;
return 0;
}
结果显示:
可以小码路的爸爸有点不耐烦了,比较喜欢打麻将,于是他一边辅导作业,一边打麻将,妈妈就专心辅导作业。
于是将
代码语言:javascript复制string HomeWork(string _work){return _work;}
修改为
代码语言:javascript复制string HomeWork(string _work){return _work " 打麻将";}
结果显示:
什么,妈妈也打麻将了,这 不对啊
此时,小码路想到了单一职责原则,将爸爸妈妈的职责分开.
第一步:接口类
代码语言:javascript复制class Work
{
protected:
virtual string HomeWork(string _work)=0;
public:
virtual string Home(string _work)=0;
};
第二步:爸爸工作
代码语言:javascript复制class BB:public Work
{
protected:
string HomeWork(string _work)
{
return _work " 打麻将 ";
}
public:
string Home(string _work)
{
return HomeWork(_work) "爸爸做";
}
第三步:妈妈工作
代码语言:javascript复制class MM:public Work
{
protected:
string HomeWork(string _work)
{
return _work;
}
public:
string Home(string _work)
{
return HomeWork(_work) "妈妈做";
}
};
第四步:主函数
代码语言:javascript复制int main()
{
//修改后
Work *workB=new BB();
Work *workM=new MM();
cout<<workB->Home("辅导作业")<<endl;
cout<<workM->Home("辅导作业")<<endl;
}
结果显示: