定义
单一职责原则的英文名称是Single Responsibility Principle,缩写是SRP. 就一个类而言,类的职责单一,对外只提供一种功能,而它变化的原因应该仅有一个引起。通俗点讲就是一个类中的函数只为一种功能服务,相关性非常高。
案例
一组玩家组队去傲来国钓鱼。
//
// 非单一职责原则.cpp
// c++
//
// Created by 刘龙玲 on 16/5/1.
// Copyright © 2016年 liulongling. All rights reserved.
//
#include <iostream>
#include <list>
#include <map>
using namespace std;
//五人组队AL组队钓鱼
//钓鱼玩家
class User
{
public:
User(int id)
{
this->userId = id;
}
int getId()
{
return this->userId;
}
private:
int userId;
};
class Fishing
{
public:
void fishEat()
{
cout<<"xx的鱼竿吃勾了...."<<endl;
}
//玩家进入房间
void insert(User user)
{
//房间最多只能5人
if(this->users.size() >=5)
{
cout<<"房间人数已满"<<endl;
return;
}
this->users.push_back(user);
}
//玩家离开房间
void exit(User user)
{
//this->users.remove(user);
}
private:
list<User> users;
};
int main()
{
Fishing fish;
for(int i = 0 ;i<6;i++){
User user(i+1);
fish.insert(user);
}
fish.fishEat();
return 0;
}
从上面代码可以看到钓鱼类做了2种事情,除了用户和鱼之间的操作 还有用户进入退出房间的操作。而单一职责原则的定义是对外只提供一种功能,而它提供了2种功能。所以需要做解耦。代码如下:
//
// 单一职责原则.cpp
// c++
//
// Created by 刘龙玲
// Copyright © 2016年 liulongling. All rights reserved.
//
#include <iostream>
#include <list>
using namespace std;
//AL组队钓鱼
//钓鱼玩家
class User
{
public:
User(int id)
{
this->userId = id;
this->eatTime =1;
}
int getId()
{
return this->userId;
}
time_t getEatTime()
{
return this->eatTime;
}
private:
int userId;
int eatTime;
};
//钓鱼房间
class FishingRoom
{
public:
FishingRoom()
{
this->users.clear();
}
//玩家进入房间
void insert(User user)
{
cout<<"ID"<<user.getId()<<"进入房间"<<endl;
//房间最多只能5人
if(this->users.size() >=5)
{
cout<<"房间人数已满"<<endl;
return;
}
this->users.push_back(user);
}
//玩家离开房间
void exit(User user)
{
}
list<User> getUsers()
{
return this->users;
}
private:
list<User> users;
};
class Fishing
{
public:
Fishing(FishingRoom* room)
{
this->room = room;
}
void fishEat()
{
for(User& user:this->room->getUsers())
{
if(user.getEatTime()>0)
{
cout<<"ID "<<user.getId()<<"的鱼竿吃勾了...."<<endl;
}
sleep(2);
}
}
FishingRoom* getRoom()
{
return this->room;
}
private:
FishingRoom* room;
};
int main()
{
FishingRoom* room = new FishingRoom;
Fishing fish(room);
for(int i = 0 ;i<6;i++){
User user(i+1);
fish.getRoom()->insert(user);
}
fish.fishEat();
return 0;
}
下一篇 开闭原则-带你走进梦幻西游(二)