内容:

在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:

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++实现中介者模式--虚拟聊天室的更多相关文章

  1. 非阻塞模式ServerSocketChannel 聊天室服务器端

    import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import ja ...

  2. 设计模式之二十一:中介者模式(Mediator)

    中介者模式:定义了一个对象.用来封装一系列对象的交互.中介者模式通过使对象之间不必显式引用减少了对象之间的耦合,而且同意你独立改变它们之间的交互. 中介者模式就是将对象之间的交互封装在了一个独立的对象 ...

  3. PHP设计模式之中介者模式

    上回说道,我们在外打工的经常会和一类人有很深的接触,那就是房产中介.大学毕业后马上就能在喜欢的城市买到房子的X二代不在我们的考虑范围内哈.既然需要长期的租房,那么因为工作或者生活的变动,不可避免的一两 ...

  4. 中介者模式(QQ聊天室我觉得是个很生动的例子简单易懂)

    设计模式之中介者模式(Mediator) 一.初识中介者模式 那些年,我们一起上过的大学,班级里有班长,有团书记.想一想如果没有QQ这种通讯工具的话,那么班长或者团支书该怎样下达消息呢??同时,班级上 ...

  5. 重构 JAVA 聊天室 —— CS 模式的简单架构实现

    前言 自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 JAVA 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有 ...

  6. C#设计模式-中介者模式

    在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 一. 中介者(Mediator)模式 从 ...

  7. 设计模式学习之中介者模式(Mediator,行为型模式)(18)

    转载地址:http://www.cnblogs.com/zhili/p/MediatorPattern.html 一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信 ...

  8. C#设计模式(18)——中介者模式(Mediator Pattern)

    一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 二. 中介者模式的介绍 2.1 ...

  9. 大熊君说说JS与设计模式之------中介者模式Mediator

    一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...

随机推荐

  1. 【计算机网络】TCP的三次握手与四次挥手

    今天讲一下TCP的三次握手与四次挥手 1.首先说TCP 协议的特点:TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠.有序.无丢失和不重复问题.TCP 是TCP/IP 体系中 ...

  2. HBase常用shell操作

    行(row),列(Column),列蔟(Column Family),列标识符(Column Qualifier)和单元格(Cell) 行:由一个个行键(rowkey)和一个多个列组成.其中rowke ...

  3. 分布式边缘容器项目 SuperEdge v0.7.0 版本来袭!

    作者 SuperEdge 开发者团队,腾讯云容器中心TKE Edge团队 摘要 SuperEdge是基于原生Kubernetes的分布式边缘云容器管理系统,由腾讯云牵头,联合英特尔.VMware威睿. ...

  4. php 23种设计模式 - 设计模式简介以及分类

    一. Introduction[介绍] 设计模式:提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题.设计模式并不一定就是一个类库或者第三方框架,它们更多的表现为一种思想并且广泛地应用在系 ...

  5. MYSQL数年库安装

    MySQL系列 MySQL 的三大主要分支mysqlmariadbpercona Server MySQL系列2.2.2.1 MySQL 的三大主要分支mysqlmariadbpercona Serv ...

  6. async-validator 源码学习(一):文档翻译

    async-validator 是一个表单异步校验库,阿里旗下的 Ant-design 和 Element 组件库中的表单验证使用的都是 async-validator ,目前版本已更新到 4.0.7 ...

  7. ENVI提取水系并进行生态敏感性分析

    4 具体步骤 4.1 DEM数据拼接 (1)打开ENVI软件,选择[File][Open],添加文件夹DEM数据中的影像,操作如图4.1.1所示,结果如图4.1.2. 图4.1.1 添加DEM数据影像 ...

  8. python 矩阵顺时针旋转90度

    # 4*4矩阵旋转90度 def matrix_transposition(data): for index,row in enumerate(data): for col in range(inde ...

  9. 面向服务开发(SOA)

    面向服务的体系结构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语言 ...

  10. FreeBSD 利用IPFW实现限制局域网使用QQ

    QQ服务器分为三类: 1.UDP 8000端口类7个:速度最快,服务器最多.QQ上线会向这7个服务器发送UDP数据包,选择回复速度最快的一个作为连接服务器.这7个服务器名字均以sz-sz7开头,域后缀 ...