下面以两个例子来解释一下单一原则(工程源代码)

【案例1】用户权限系统

设计案例用户权限系统(用户、机构、角色管理这些模块),基本上使用的都是RBAC模型(基于角色的访问控制,通过分配和取消角色来完成用户权限的授予和取消,使动作主体(用户)与资源的行为(权限)分离),确实是一个很好的解决方案。

传统方法:

#include <QCoreApplication>
#include <iostream>
/*!* \brief The UserInfo class*/
class UserInfo{public:void SetUserID(std::string userID);std::string GetUserID();void SetUserName(std::string userName);std::string GetUserName();void SetUserPasswd(std::string userPasswd);std::string GetUserPasswd();void DeleteUser(std::string userName);void ChangeUserPasswd(std::string &oldUserPasswd,std::string &newUserPasswd);void AddOrg(int orgID);void AddRole(int roleID);private:std::string _user_id;std::string _user_name;std::string _user_passwd;};/*!* \brief UserInfo::SetUserID* \param userID*/
void UserInfo::SetUserID(std::string userID)
{this->_user_id = userID;
}
/*!* \brief UserInfo::GetUserID* \return*/
std::string UserInfo::GetUserID()
{std::cout<<this->_user_id.c_str()<<std::endl;return this->_user_id;
}
/*!* \brief UserInfo::SetUserName* \param userName*/
void UserInfo::SetUserName(std::string userName)
{this->_user_name = userName;
}
/*!* \brief UserInfo::GetUserName* \return*/
std::string UserInfo::GetUserName()
{std::cout<<this->_user_name.c_str()<<std::endl;return this->_user_name;
}
/*!* \brief UserInfo::SetUserPasswd* \param userPasswd*/
void UserInfo::SetUserPasswd(std::string userPasswd)
{this->_user_passwd = userPasswd;
}
/*!* \brief UserInfo::GetUserPasswd* \return*/
std::string UserInfo::GetUserPasswd()
{std::cout<<this->_user_passwd.c_str()<<std::endl;return this->_user_passwd;
}
/*!* \brief UserInfo::DeleteUser* \param userName*/
void UserInfo::DeleteUser(std::string userName)
{}
/*!* \brief UserInfo::ChangeUserPasswd* \param oldUserPasswd* \param newUserPasswd*/
void UserInfo::ChangeUserPasswd(std::string &oldUserPasswd, std::string &newUserPasswd)
{}
/*!* \brief UserInfo::AddOrg* \param orgID*/
void UserInfo::AddOrg(int orgID)
{}
/*!* \brief UserInfo::AddRole* \param roleID*/
void UserInfo::AddRole(int roleID)
{}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);UserInfo *myUserInfo = new UserInfo;myUserInfo->SetUserName("lili");myUserInfo->SetUserID("C-1");myUserInfo->SetUserPasswd("123456");myUserInfo->GetUserName();myUserInfo->GetUserID();myUserInfo->GetUserPasswd();delete myUserInfo;return a.exec();
}

以上设计不符合单一原则,解决方法如下:

依据定义咱们可以再重新设计下,把用户的信息抽取成一个业务对象(Business Object ,BO),把行为抽取成一个业务逻辑(Business Logic,Biz)

#include <QCoreApplication>
#include <iostream>
/*!* \brief The UserBo class*/
class UserBo{public:void SetUserID(std::string userID);std::string GetUserID();void SetUserName(std::string userName);std::string GetUserName();void SetUserPasswd(std::string userPasswd);std::string GetUserPasswd();public:std::string _user_id;std::string _user_name;std::string _user_passwd;};
/*!* \brief UserBo::SetUserID* \param userID*/
void UserBo::SetUserID(std::string userID)
{this->_user_id = userID;
}
/*!* \brief UserBo::GetUserID* \return*/
std::string UserBo::GetUserID()
{std::cout<<this->_user_id.c_str()<<std::endl;return this->_user_id;
}
/*!* \brief UserBo::SetUserName* \param userName*/
void UserBo::SetUserName(std::string userName)
{this->_user_name = userName;
}
/*!* \brief UserBo::GetUserName* \return*/
std::string UserBo::GetUserName()
{std::cout<<this->_user_name.c_str()<<std::endl;return this->_user_name;
}
/*!* \brief UserBo::SetUserPasswd* \param userPasswd*/
void UserBo::SetUserPasswd(std::string userPasswd)
{this->_user_passwd = userPasswd;
}
/*!* \brief UserBo::GetUserPasswd* \return*/
std::string UserBo::GetUserPasswd()
{std::cout<<this->_user_passwd.c_str()<<std::endl;return this->_user_passwd;
}
/*!* \brief The UserBiz class*/
class UserBiz{public:void DeleteUser(UserBo myUserBo);void ChangeUserPasswd(UserBo *myUserBo,std::string &oldUserPasswd,std::string &newUserPasswd);void AddOrg(UserBo myUserBo,int orgID);void AddRole(UserBo myUserBo,int roleID);};/*!* \brief UserBiz::DeleteUser* \param myUserBo*/
void UserBiz::DeleteUser(UserBo myUserBo)
{}
/*!* \brief UserBiz::ChangeUserPasswd* \param oldUserPasswd* \param newUserPasswd*/
void UserBiz::ChangeUserPasswd(UserBo *myUserBo,std::string &oldUserPasswd, std::string &newUserPasswd)
{if (!myUserBo->_user_passwd.compare(oldUserPasswd)){myUserBo->_user_passwd = newUserPasswd;std::cout<<myUserBo->_user_passwd<<std::endl;}}
/*!* \brief UserBiz::AddOrg* \param myUserBo* \param orgID*/
void UserBiz::AddOrg(UserBo myUserBo, int orgID)
{}
/*!* \brief UserBiz::AddRole* \param myUserBo* \param roleID*/
void UserBiz::AddRole(UserBo myUserBo, int roleID)
{}
/*!* \brief The NewUserInfo class*/
class UserInfo : public UserBo,public UserBiz{};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);UserInfo *myUserInfo = new UserInfo;UserBo *myUserBo= (UserBo *)myUserInfo;myUserBo->SetUserName("lili");myUserBo->SetUserID("C-1");myUserBo->SetUserPasswd("123456");myUserBo->GetUserID();myUserBo->GetUserName();myUserBo->GetUserPasswd();UserBiz *myUserBiz = (UserBiz *)myUserInfo;myUserBiz->ChangeUserPasswd(myUserBo,myUserBo->_user_passwd,std::string("789012"));return a.exec();
}

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

在实际应用中,类的设计尽量做到只有一个原因引起变化,接口一定要做到单一职责原则,方法一定要做到单一职责原则,即一个方法只实现一个功能。

参考文献:

  1. 单一职责原则(Single Responsibility Principle)
  2. 单一职责原则——面向对象设计原则
  3. 设计模式七大原则
  4. 单一职责原则(C++)
  5. 单一职责原则
  6. C++ string字符串比较方法详解

深入浅出设计模式原则之单一原则(SRP)相关推荐

  1. 深入浅出设计模式_深入浅出设计模式03接口隔离原则

    本文作者:开课吧寂然 图文编辑:开三金 大家好~,我是寂然~,本节课呢,我来给大家介绍设计模式原则之接口隔离原则. 话不多说,我们直接进入正题,老规矩,首先带大家了解一下接口隔离原则的官方定义,并作一 ...

  2. 面向对象设计原则(一)单一原则

    面向对象设计原则之单一原则 单一原则是最简单的面向对象设计原则,它用于控制类的粒度大小. 单一原则的定义 单一职责原则定义如下: 单一职责原则(Single Responsibility Princi ...

  3. 大话设计模式三之单一职责原则、开放-封闭原则、依赖倒置原则、里氏代换原则

    单一职责原则 单一职责原则(SRP),意思就是说,功能要单一.准确解释是,就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或 ...

  4. 经典设计原则:单一职责原则(SRP)

    本文详解设计原则中的单一职责原则,目的还是提高代码的可读性.可扩展性.复用性.可维护性等. 目录 1. 单一职责原则(SRP) 2. 如何理解单一职责原则? 3. 如何判断类的职责是否足够单一? 4. ...

  5. 设计模式-02.经典设计原则-第一节-单一职责原则,开闭原则,里式替换,接口隔离【万字长文系列】

    文章目录 设计模式经典设计原则-第一节 单一职责原则(SRP) 如何理解单一职责原则? 如何判断类的职责是否足够单一? 类的职责是否设计得越单一越好? 开闭原则(OCP) 如何理解"对扩展开 ...

  6. SOLID原则:单一职责原则(SRP)

    SOLID:SOLID 原则并非单纯的1个原则,而是由5个设计原则组成,它们分别是:单一职责原则.开闭原则.里式替换原则.接口隔离原则和依赖反转原则,SOLID 由5个设计原则的头一个字母组成. 如何 ...

  7. 设计模式六大原则(一)----单一职责原则

    设计模式六大原则之[单一职则原则] 一.什么是单一职责原则 首先, 我们来看单一职责的定义. 单一职责原则,全称Single Responsibility Principle, 简称SRP. A cl ...

  8. 设计模式中遵循的原则:单一职责、开发-封闭、依赖倒转

    设计模式中遵循的原则:单一职责.开放-封闭.依赖倒转 单一职责原则 一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这 ...

  9. 设计模式_01_单一原则

    设计模式_01_单一原则 package designPatternOf_01; /*** 单一原则示例:动物呼吸* 引入的问题:鱼不吸空气,吸水*/ public class SinglePrinc ...

最新文章

  1. HoloLens开发手记 - 语音输入 Voice input
  2. oracle 10g rac重建crs
  3. Chapter 3 Phenomenon——24
  4. springboot 开发入门,及问题汇总
  5. 网易云信实时音频框架背后:算法优化带来产品体验全面提升
  6. Android安卓模拟器中模拟SD卡
  7. rabbitmq技术的一些感悟(二)
  8. 海岸鸿蒙慕建洲,用于校准液体自动颗粒计数器的标准物质及其制备方法.pdf
  9. Ruoyi框架Maven编译不通过的问题---SpringCloud Alibaba_若依微服务框架改造---工作笔记006
  10. VC++工作笔记0003---C++中的explicit关键字
  11. 从 SAS 到 NVMe,换个底盘就完儿事了?
  12. 东南大学微型计算机期末,12级东南大学微机期中试卷
  13. p8b75-m修改bios文件_傻瓜式方法:VMWARE使用NAT方式彻底解决开发板无法挂载ubuntu文件的难题...
  14. i2c驱动之调用ioctl函数进行读写at24c08
  15. 银行间市场评论员文章词云绘制效果
  16. React TypeScript react+ts 包下载
  17. 设置导航栏字体大小,颜色和加粗字体的方法
  18. ios 真机运行:The app ID cannot be registered to your development team
  19. java_系列3_数组
  20. 网易游戏 Flink SQL 平台化实践

热门文章

  1. wxWidgets的简介
  2. boost::mp11::mp_remove相关用法的测试程序
  3. boost::hana::group用法的测试程序
  4. boost::graph::distributed::hohberg_biconnected_components用法的测试程序
  5. boost::container模块实现默认初始化的程序
  6. ITK:应用Exp负图像过滤器
  7. VTK:PolyData之WarpSurface
  8. VTK:IO之ConvertFile
  9. OpenCV极变换polar transforms的实例(附完整代码)
  10. OpenCV delaunay三角剖分和voronoi镶嵌的实例(附完整代码)