c++实现中介者模式--虚拟聊天室
内容:
在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:
1. 新的具体聊天室中发送的图片大小不得超过20M。
2. 新的具体聊天室中发送的文字长度不得超过100个字符。
3. 新的具体会员类可以发送图片信息和文本信息。
4. 新的具体会员类在发送文本信息时,可以在信息后加上时间。
修改客户端测试类,注意原有系统类代码和客户端代码的修改。
代码:
#include<iostream>
#include<map>
#include<ctime>
#include<sstream>
using namespace std;
class AbstractChatroom;
string m_replace(string strSrc,const string &oldStr, const string &newStr,int count=-1)
{
string strRet=strSrc;
size_t pos = 0;
int l_count=0;
if(-1 == count) //替换所有
count = strRet.size();
while ((pos = strRet.find(oldStr, pos)) != string::npos)
{
strRet.replace(pos, oldStr.size(), newStr);
if(++l_count >= count) break;
pos += newStr.size();
}
return strRet;
}
class Member {
protected :
AbstractChatroom *chatroom;
string name;
public:
Member(string name) {
this->name=name;
}
AbstractChatroom* getChatroom() {
return chatroom;
}
void setChatroom(AbstractChatroom *chatroom) {
this->chatroom = chatroom;
}
string getName() {
return name;
}
void setName(string name) {
this->name = name;
}
virtual void sendText(string to,string message)=0;
virtual void sendImage(string to,string image)=0;
void receiveText(string from,string message) {
cout<<from<<"发送文本给"<<this->name<<",内容为:"<<message<<endl;
}
void receiveImage(string from,string image) {
cout<<from<<"发送图片给"<<this->name<<",内容为:"<<image<<endl;
}
};
class AbstractChatroom {
public:
virtual void registers(Member *member)=0;
virtual void sendText(string from,string to,string message)=0;
virtual void sendImage(string from,string to,string image)=0;
};
class ChatGroup: public AbstractChatroom{
private:
map<string, Member*> members;
map<string, Member*>::iterator iter;
public:
void registers(Member *member) {
iter=members.find(member->getName());
if(iter==members.end()) {
members.insert(map<string, Member*>::value_type(member->getName(),member));
member->setChatroom(this);
}
}
void sendText(string from, string to, string message) {
Member *member=members.find(to)->second;
string newMessage=message;
newMessage=m_replace(message,"日", "*");
member->receiveText(from, newMessage);
}
void sendImage(string from, string to, string image) {
Member *member= members.find(to)->second;
if(image.length()>5) {
cout<<"图片太大,发送失败"<<endl;
}
else {
member->receiveImage(from, image);
}
}
};
class NewChat:public AbstractChatroom{
private:
map<string, Member*> members;
map<string, Member*>::iterator iter;
public:
void registers(Member *member) {
iter=members.find(member->getName());
if(iter==members.end()) {
members.insert(map<string, Member*>::value_type(member->getName(),member));
member->setChatroom(this);
}
}
void sendText(string from, string to, string message) {
Member *member=members.find(to)->second;
string newMessage=message;
newMessage=m_replace(message,"日", "*");
if(message.length()>100) {
cout<<"发送的文字长度不得超过100个字符,发送失败"<<endl;
}
else {
member->receiveText(from, newMessage);
}
}
void sendImage(string from, string to, string image) {
Member *member=members.find(to)->second;
if(image.length()>20) {
cout<<"图片大小不得超过20M,发送失败"<<endl;
}
else {
member->receiveImage(from, image);
}
}
};
class CommonMember :public Member{
protected :
string name;
public:
CommonMember(string name):Member(name) {
this->name=name;
}
void sendText(string to, string message) {
cout<<"普通会员发送消息:"<<endl;
chatroom->sendText(this->name, to, message);
} void sendImage(string to, string image) {
cout<<"普通会员不能发送图片!"<<endl;
} };
class DiamondMember :public Member{
protected :
string name;
public:
DiamondMember(string name):Member(name){
this->name=name;
}
void sendText(string to, string message) {
cout<<"钻石会员发送消息:"<<endl;
chatroom->sendText(name,to, message);
}
void sendImage(string to, string image) {
cout<<"钻石会员发送图片:"<<endl;
chatroom->sendImage(name, to, image);
}
};
class CrownMember :public Member{
protected :
string name;
public:
CrownMember(string name):Member(name){
this->name=name;
}
void sendText(string to, string message) {
time_t now = time(NULL);
tm* t = localtime(&now);
// 将信息输出到字符串流
stringstream ss;
stringstream ss2;
ss << t->tm_year + 1900 << "." << t->tm_mon + 1 << "." <<
t->tm_mday << ".." << t->tm_hour << "." << t->tm_min << "." << t->tm_sec;
cout<<"皇冠会员发送消息:"<<endl;
chatroom->sendText(name,to,message+" 现在时间"+ss.str());
}
void sendImage(string to, string image) {
cout<<"皇冠会员发送图片:"<<endl;
chatroom->sendImage(name, to, image);
}
};
int main(){
//AbstractChatroom *happyChat=new ChatGroup();
AbstractChatroom *newChat=new NewChat(); stringstream ss;//生成100个以上的字符 Member *member1,*member2,*member3,*member4,*member5,*member6;
member1=new DiamondMember("张三");
member2=new DiamondMember("李四");
member3=new CommonMember("王五");
member4=new CommonMember("小芳");
member5=new CommonMember("小红");
member6=new CrownMember("雨轩"); newChat->registers(member1);
newChat->registers(member2);
newChat->registers(member3);
newChat->registers(member4);
newChat->registers(member5);
newChat->registers(member6); member1->sendText("李四","李四,你好!");
member2->sendText("张三","张三,你好!");
member1->sendText("李四","今天天气不错,有日!");
member2->sendImage("张三","一个很大很大的太阳");
member2->sendImage("张三","太阳");
member3->sendText("小芳","还有问题吗?");
member3->sendText("小红","还有问题吗?");
member4->sendText("王五","没有了,谢谢!");
member5->sendText("王五","我也没有了!");
member5->sendImage("王五","谢谢");
member6->sendText("王五","今天老师的作业怎么没有完成");
member6->sendImage("王五", "..................................................");
member6->sendText("王五", "今天老师的作业怎么没有完成,你知道老师有多么的容易吗,不知道体谅一下吗");
for(int i=0;i<110;i++) {
ss <<"-";
}
member6->sendText("王五",ss.str());
}
运行结果:

c++实现中介者模式--虚拟聊天室的更多相关文章
- 非阻塞模式ServerSocketChannel 聊天室服务器端
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import ja ...
- 设计模式之二十一:中介者模式(Mediator)
中介者模式:定义了一个对象.用来封装一系列对象的交互.中介者模式通过使对象之间不必显式引用减少了对象之间的耦合,而且同意你独立改变它们之间的交互. 中介者模式就是将对象之间的交互封装在了一个独立的对象 ...
- PHP设计模式之中介者模式
上回说道,我们在外打工的经常会和一类人有很深的接触,那就是房产中介.大学毕业后马上就能在喜欢的城市买到房子的X二代不在我们的考虑范围内哈.既然需要长期的租房,那么因为工作或者生活的变动,不可避免的一两 ...
- 中介者模式(QQ聊天室我觉得是个很生动的例子简单易懂)
设计模式之中介者模式(Mediator) 一.初识中介者模式 那些年,我们一起上过的大学,班级里有班长,有团书记.想一想如果没有QQ这种通讯工具的话,那么班长或者团支书该怎样下达消息呢??同时,班级上 ...
- 重构 JAVA 聊天室 —— CS 模式的简单架构实现
前言 自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 JAVA 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有 ...
- C#设计模式-中介者模式
在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 一. 中介者(Mediator)模式 从 ...
- 设计模式学习之中介者模式(Mediator,行为型模式)(18)
转载地址:http://www.cnblogs.com/zhili/p/MediatorPattern.html 一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信 ...
- C#设计模式(18)——中介者模式(Mediator Pattern)
一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 二. 中介者模式的介绍 2.1 ...
- 大熊君说说JS与设计模式之------中介者模式Mediator
一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...
随机推荐
- 03-Eureka注册中心
1.介绍 2.快速开始 2.1 pom文件依赖 <?xml version="1.0" encoding="UTF-8"?> <project ...
- gdb调试快速入门
编译指令 gcc test.c -o test -g -g是加入调试信息,加入源码信息 启动gdb调试 gdb test 进入gdb中 设置参数 set args 10 20 显示参数show age ...
- Tableau学习Step5一表计算、详细级别表达式、动作、外接python
Tableau学习Step5一表计算.详细级别表达式.动作.外接python 本文首发于博客冰山一树Sankey,去博客浏览效果更好. ) Tableau学习Step4一数据解释.异常值监测.参数使用 ...
- JZ-061-序列化二叉树
序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存. 序 ...
- MaRVIN
[ResourceRegistration] 加给Resource类 [ResourceReference(--)] 加给Resource类中引动到的Resource类,引用多个的话用IReferen ...
- linux作业--第十一周
1. 导入hellodb.sql生成数据库 (1) 在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄 (2) 以ClassID为分组依据,显示每组的平均年龄 (3) 显示第2题中 ...
- 微信小程序表单验证(WxValidate使用)
参考博客: https://www.cnblogs.com/zhangxiaoyong/p/10166951.html https://github.com/wux-weapp/wx-extend/b ...
- PHP防止订单超卖,秒杀,限购,PHP高并发防止超卖代码实践
建表 1.订单表 CREATE TABLE `order` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_sn` varchar(45) NOT NUL ...
- LGP2726题解
当初 mark 这道题还是因为看到是黑,感觉比较水,然后它现在掉紫了. 不过这题题解居然满了,写一篇给自己看吧. 首先我们有一个思路,就是割掉一条边,然后分别求两颗树的重心. 等等,这好像是CSP原题 ...
- table元素使用bug
一.问题的产生 javaWeb课上老师让我们用表单做一个简单的自我介绍,但是在对表单里的单元格进行合并时出现了变形的情况,这里做个记录. 二.实验 让我们先做一个简单的4*4表格 <!DOCTY ...