您的位置:首页 > 其它

设计模式六大原则:单一职责原则-带你走梦幻西游(一)

2016-04-27 20:48 351 查看
依赖倒置原则(二)



开闭原则(三)

迪米特原则-带你走进梦幻西游(四)

里氏替换原则(五)

接口隔离原则(六)

定义

单一职责原则的英文名称是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;
}


下一篇 开闭原则-带你走进梦幻西游(二)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: