设计模式之禅-单一职责原则
一 简介
在类的设计中,为了使得类的设计具有更好的可读性,可维护性,通常将这个类设计为只完成唯一的任务(职责),但是这通常是很难实现的,因为有实际的外界因素影响。
二 实例分析
实例1:将一个用户的属性和行为在不同的类中设计。
1.用户属性类
/*用户信息的属性--只负责用户的属性*/
class IUserBO
{
public:
virtual void setUserID(string userID) = 0;
virtual string getUerID() = 0;
virtual void setPassword(string password) = 0;
virtual string getUserPassword() = 0;
virtual void setUserName(string userName) = 0;
virtual string getUserName() = 0;
};
2.用户行为类
/*用户信息的业务操作--只负责用户的行为*/
class IUserBiz
{
public:
virtual bool changePassword(string password) = 0;
virtual bool deleteUser() = 0;
};
3.形成统一的用户接口
/*实际的用户信息接口-继承了用户属性和行为的的接口*/
class IUserInfo : public IUserBO,public IUserBiz
{
public:
};
/*实际的用户信息类*/
class UserInfo : public IUserInfo
{
public:
//属性
void setUserID(string userID) override
{
cout << "setUserID" << endl;
}
string getUerID() override
{
return "getUerID";
}
void setPassword(string password) override
{
cout << "serPassword" << endl;
}
string getUserPassword() override
{
return "getUserPassword";
}
void setUserName(string userName) override
{
cout << "setUserName" << endl;
}
string getUserName() override
{
return "getUserName";
}
//行为
bool changePassword(string password) override
{
cout << "changePassword" << endl;
return true;
}
bool deleteUser() override
{
cout << "deleteUser" << endl;
return true;
}
};
5.main测试
int main()
{
//用户信息(属性和行为)对象
IUserInfo* userInfo = new UserInfo;
cout << "设置用户属性信息" << endl;
//转换成用户属性对象
IUserBO* userBO = static_cast<IUserBO*>(userInfo);
cout << userBO->getUserPassword() << endl;
cout << userBO->getUerID() << endl;
cout << userBO->getUserName() << endl;
userBO->setPassword("123456");
userBO->setUserID("1");
userBO->setUserName("Tom");
cout << "设置用户行为" << endl;
//转换成用户行为对象
IUserBiz* userBiz = static_cast<IUserBiz*>(userInfo);
userBiz->changePassword("123789");
userBiz->deleteUser();
system("pause");
return 0;
}
测试结果
实例2:将电话的协议和数据传输封装在不同的接口中
1.电话协议接口
/*电话协议接口*/
class IConnectionManager
{
public:
virtual void dial(string phoneNumber) = 0;
virtual void hangup() = 0;
};
2.电话数据接口
/*电话数据接口*/
class IDataTransfer
{
public:
virtual void DataTransfer(IConnectionManager* com) = 0;
};
3.电话的总接口
/*电话接口*/
class IPhone : public IConnectionManager,public IDataTransfer
{
public:
};
4.电话接口的实现类
/*具体的电话类*/
class Phone :public IPhone
{
public:
void dial(string phoneNumber) override
{
cout << "dial" << endl;
}
void hangup() override
{
cout << "hangup" << endl;
}
void DataTransfer(IConnectionManager* com) override
{
cout << "DataTransfer" << endl;
}
};
5.main测试
int main()
{
//电话类
IPhone* iphone = new Phone;
//电话协议接口
IConnectionManager* com = static_cast<IConnectionManager*>(iphone);
com->dial("213");
com->hangup();
//电话数据传输接口
IDataTransfer* transfer = static_cast<IDataTransfer*>(iphone);
transfer->DataTransfer(com);
system("pause");
return 0;
}
测试结果
三 总结
单一职责原则简称SRP原则,在实际工作中,可能不会经常用到,但是我们必须知道这个原则,建议大家看看设计模式之禅这本书。
下面是这次的云盘资料:https://yunpan.cn/cSSeVREPqE69R 访问密码 5051