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. 注意编程规范。
浙公网安备 33010602011771号