中介者模式javac++

软件设计                  石家庄铁道大学信息学院

 

实验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--------------------");
}

 

 

posted @ 2022-12-23 17:03  zrswheart  阅读(30)  评论(0编辑  收藏  举报