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