设计模式之单一职责原则C++实现

2022-06-16 14:34:28 浏览数 (1)

单一职责原则:一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分.

一个对象承担了太多的职责的缺点:

代码语言: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;
}

结果显示:


0 人点赞