软件设计 石家庄铁道大学信息学院
实验19:中介者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解中介者模式的动机,掌握该模式的结构;
2、能够利用中介者模式解决实际问题。
[实验任务一]:虚拟聊天室
在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:
1. 新的具体聊天室中发送的图片大小不得超过20M。
2. 新的具体聊天室中发送的文字长度不得超过100个字符。
3. 新的具体会员类可以发送图片信息和文本信息。
4. 新的具体会员类在发送文本信息时,可以在信息后加上时间。
修改客户端测试类,注意原有系统类代码和客户端代码的修改。
实验要求:
1. 提交源代码;
2. 注意编程规范。
package test19; public abstract class AbstractChatroom { public abstract void register(Member m); public abstract void sendtext(String a,String b,String mess); public abstract void sendimage(String a,String b,String mess); }
package test19; import java.util.*; public class ChatGroup extends AbstractChatroom{ private Hashtable ms=new Hashtable(); public void register(Member m) { if(!ms.contains(m)){ ms.put(m.getname(),m); m.setroom(this); } } public void sendtext(String a,String b,String c){ Member m=(Member)ms.get(b); String newm=c; newm=c.replaceAll("日","*"); m.receivetext(a,newm); } public void sendimage(String a,String b,String c){ Member m=(Member)ms.get(b); if(c.length()>5){ System.out.println("图片较大,发送失败"); }else{ m.receiveimage(a,c); } } }
package test19; public class CommonMember extends Member{ public CommonMember(String a){ super(a); } public void sendtext(String a,String c){ System.out.println("普通会员发送消息"); room.sendtext(name,a,c); } public void sendimage(String a,String c){ System.out.println("普通会员不能发送图片"); } }
package test19; public class DiamondMember extends Member{ public DiamondMember(String a){ super(a); } public void sendtext(String a,String c){ System.out.println("钻石会员发送消息"); room.sendtext(name,a,c); } public void sendimage(String a,String c){ System.out.println("钻石会员发送图片"); room.sendimage(name,a,c); } }
package test19; public class main { public static void main(String args[]){ AbstractChatroom r1=new NewGroup(); Member m1,m2,m3; m1=new NewMember("小张"); m2=new NewMember("小龚"); m3=new NewMember("小橘"); r1.register(m1); r1.register(m2); r1.register(m3); m1.sendtext("小张",":小张,你好"); m2.sendtext("小龚",":小龚,你好"); m1.sendtext("小张",":你在家吗?"); m2.sendtext("小龚",":在"); m1.sendtext("小橘",":---------------------------------------------------------------------------------------------------------------------------------------------------------------------------"); m3.sendimage("小龚",":哈哈.jpg"); m2.sendimage("小橘",":哈哈.jpg--------------------"); } }
package test19; public abstract class Member { protected AbstractChatroom room; protected String name; public Member(String a){ name=a; } public String getname(){ return name; } public void setname(String a){ name=a; } public AbstractChatroom getroom(){ return room; } public void setroom(AbstractChatroom a){ room=a; } public abstract void sendtext(String a,String mess); public abstract void sendimage(String a,String image); public void receivetext(String a,String mess){ System.out.println(a+"发送的给"+name+"内容是"+mess); } public void receiveimage(String a,String image){ System.out.println(a+"发送的给"+name+"内容是"+image); } }
package test19; import java.util.HashMap; import java.util.Map; public class NewGroup extends AbstractChatroom{ Map<String,Member> table = new HashMap<>(); public void register(Member member) { table.put(member.getname(), member); member.setroom(this); } public void sendtext(String from, String to, String message) { if(message.length()>=100){ System.out.println("超过100个字符,发送失败"); }else{ Member member = table.get(to); if(member!=null) member.receivetext(from, message); } } public void sendimage(String from, String to, String message) { if(message.length()>=20){ System.out.println("图片超过20M,发送失败"); }else{ Member member = table.get(to); if(member!=null) member.receiveimage(from, message); } } }
package test19; public class NewMember extends Member{ public NewMember(String a){ super(a); } public void sendtext(String a,String c){ System.out.println("新会员发送消息:"); room.sendtext(name,a,c); } public void sendimage(String a,String c){ System.out.println("新会员发送图片:"); room.sendimage(name,a,c); } }
#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--------------------"); }