10.23

实验19:中介者模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解中介者模式的动机,掌握该模式的结构;

2、能够利用中介者模式解决实际问题。

 

[实验任务一]:虚拟聊天室

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

1. 新的具体聊天室中发送的图片大小不得超过20M

2. 新的具体聊天室中发送的文字长度不得超过100个字符。

3. 新的具体会员类可以发送图片信息和文本信息。

4. 新的具体会员类在发送文本信息时,可以在信息后加上时间。

修改客户端测试类,注意原有系统类代码和客户端代码的修改。

实验要求:

1. 画出对应的类图

 

2. 提交源代码

import datetime

class ChatRoomMediator:
    def __init__(self):
        self.members = []

    def add_member(self, member):
        self.members.append(member)
        member.set_mediator(self)

    def send_message(self, sender, message):
        for member in self.members:
            if member != sender:  # 只让其他成员接收消息
                member.receive_message(sender, message)

class Member:
    def __init__(self, name):
        self.name = name
        self.mediator = None

    def set_mediator(self, mediator):
        self.mediator = mediator

    def send_message(self, message):
        self.mediator.send_message(self, message)

    def receive_message(self, sender, message):
        raise NotImplementedError("This method should be overridden in subclasses.")

class LimitedChatRoom(Member):
    MAX_IMAGE_SIZE = 20 * 1024 * 1024  # 20MB
    MAX_TEXT_LENGTH = 100

    def __init__(self, name="Limited Chat Room"):
        super().__init__(name)

    def receive_message(self, sender, message):
        if isinstance(message, ImageMessage):
            if message.size > self.MAX_IMAGE_SIZE:
                print(f"图片大小超过限制:{message.size / (1024 * 1024):.2f}MB,来自 {sender.name}")
                return
            print(f"{sender.name} 发送了一张图片: {message.url} ({message.size / (1024 * 1024):.2f}MB)")
        elif isinstance(message, TextMessage):
            if len(message.content) > self.MAX_TEXT_LENGTH:
                print(f"文本长度超过限制,来自 {sender.name}。")
                return
            timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            print(f"{sender.name} 发送了文本: {message.content} [发送时间: {timestamp}]")
        else:
            print("不支持的消息类型。")

class ChatMember(Member):
    def send_image(self, url, size):
        image_message = ImageMessage(url, size)
        self.send_message(image_message)

    def send_text(self, content):
        text_message = TextMessage(content)
        self.send_message(text_message)

    def receive_message(self, sender, message):
        # 在此处处理接收到的消息
        if isinstance(message, ImageMessage):
            print(f"{self.name} 收到了一张图片,来自 {sender.name}: {message.url} ({message.size / (1024 * 1024):.2f}MB)")
        elif isinstance(message, TextMessage):
            print(f"{self.name} 收到了一条文本消息,来自 {sender.name}: {message.content}")

class Message:
    pass

class ImageMessage(Message):
    def __init__(self, url, size):
        self.url = url
        self.size = size

class TextMessage(Message):
    def __init__(self, content):
        self.content = content

    # 客户端测试类
def main():
    mediator = ChatRoomMediator()

    chat_room = LimitedChatRoom("Limited Chat Room")
    mediator.add_member(chat_room)

    member1 = ChatMember("Alice")
    member2 = ChatMember("Bob")

    mediator.add_member(member1)
    mediator.add_member(member2)

    # 测试发送图片
    member1.send_image("http://example.com/image1.jpg", 15 * 1024 * 1024)  # 15MB
    member2.send_image("http://example.com/image2.jpg", 25 * 1024 * 1024)  # 25MB,超过限制

    # 测试发送文本
    member1.send_text("Hello, this is a test message.")
    member2.send_text("This is a very long message that exceeds the limit of one hundred characters. "
                      "This part is just to ensure that the message length is indeed more than one hundred characters.")

if __name__ == "__main__":
    main()

 

3注意编程规范。

 

 

posted @ 2024-11-27 08:21  The-rich  阅读(15)  评论(0)    收藏  举报