软件设计实验19
实验19:中介者模式
[实验任务一]:虚拟聊天室
在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:
1. 新的具体聊天室中发送的图片大小不得超过20M。
2. 新的具体聊天室中发送的文字长度不得超过100个字符。
3. 新的具体会员类可以发送图片信息和文本信息。
4. 新的具体会员类在发送文本信息时,可以在信息后加上时间。
修改客户端测试类,注意原有系统类代码和客户端代码的修改。
直接放源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | #include<iostream> #include<map> #include<ctime> #include<sstream> using namespace std; class AbstractChatroom; //抽象同事类 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; } }; string 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 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=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=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 NewMember : public Member{ protected : string name; public : NewMember(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 *newChat= new NewChat(); Member *member1,*member2,*member3,*member4; member1= new DiamondMember( "张三" ); member2= new CommonMember( "小李" ); member3= new NewMember( "小芳" ); member4= new NewMember( "小红" ); newChat->registers(member1); newChat->registers(member2); newChat->registers(member3); newChat->registers(member4); member1->sendText( "小李" , "小李,你好!" ); member2->sendText( "张三" , "张三,你好!" ); cout<< "---------------------------------------------" <<endl; member3->sendText( "小红" , "小红你好。" ); member3->sendText( "小红" , "你好小红!-----------------------------------------------------------------------------------------------------" ); member3->sendImage( "小红" , "哈哈.jpg" ); member4->sendText( "小芳" , "你好,小芳" ); member4->sendImage( "小芳" , "哈哈.jpg--------------------" ); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
2021-10-29 eclipse连接mysql