前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之单一职责原则C++实现

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

作者头像
用户9831583
发布2022-06-16 14:34:28
2870
发布2022-06-16 14:34:28
举报
文章被收录于专栏:码出名企路

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

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

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

结果显示:


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档