设计模式--中介者模式

实验19:中介者模式

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

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

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

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

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

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

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

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

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

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

源代码

/*** 抽象聊天室*/
public abstract class AbstractChatroom
{public abstract void register(Member member);public abstract void sendText(String from,String to,String message);public abstract void sendImage(String from,String to,String image);
}import java.util.Hashtable;public class ChatGroup extends AbstractChatroom
{private Hashtable members = new Hashtable();@Overridepublic void register(Member member){if (!members.contains(member)){members.put(member.getName(), member);member.setChatroom(this);}}@Overridepublic void sendText(String from, String to, String message){Member member = (Member) members.get(to);String newMessage = message;//模拟不雅字符过滤newMessage = message.replaceAll("日", "*");member.receiveText(from, newMessage);}@Overridepublic void sendImage(String from, String to, String image){Member member = (Member) members.get(to);//模拟图片大小判断if (image.length() > 5){System.out.println("图片太大,发送失败!");} else{member.receiveImage(from, image);}}
}import java.util.Hashtable;/*** 新的具体聊天室* @author mendianyu*/
public class AdvancedChatGroup extends AbstractChatroom
{private Hashtable members = new Hashtable();@Overridepublic void register(Member member){if (!members.contains(member)){members.put(member.getName(), member);member.setChatroom(this);}}@Overridepublic void sendText(String from, String to, String message){Member member = (Member) members.get(to);//消息的文字长度不得超过100if (message.length() > 100){System.out.println("消息太长了,发送失败!");} else{member.receiveText(from, message);}}@Overridepublic void sendImage(String from, String to, String image){Member member = (Member) members.get(to);//图片大小不得超过20Mif (image.length() > 20){System.out.println("图片太大了,发送失败!");} else{member.receiveImage(from, image);}}
}/*** 抽象用户类*/
public abstract class Member
{protected AbstractChatroom chatroom;protected String name;public Member(String name){this.name = name;}public String getName(){return name;}public void setName(String name){this.name = name;}public AbstractChatroom getChatroom(){return chatroom;}public void setChatroom(AbstractChatroom chatroom){this.chatroom = chatroom;}public abstract void sendText(String to, String message);public abstract void sendImage(String to, String image);public void receiveText(String from, String message){System.out.println(from + "发送文本给" + this.name + ",内容为:" + message);}public void receiveImage(String from, String image){System.out.println(from + "发送图片给" + this.name + ",内容为:" + image);}
}/*** 普通用户类*/
public class CommonMember extends Member
{public CommonMember(String name){super(name);}@Overridepublic void sendText(String to, String message){System.out.println("普通会员发送信息:");//发送文本chatroom.sendText(name, to, message);}@Overridepublic void sendImage(String to, String image){System.out.println("普通会员不能发送图片!");}
}/*** 钻石会员类*/
public class DiamondMember extends Member
{public DiamondMember(String name){super(name);}@Overridepublic void sendText(String to, String message){System.out.println("钻石会员发送信息:");//发送文本chatroom.sendText(name, to, message);}@Overridepublic void sendImage(String to, String image){System.out.println("钻石会员发送图片:");//发送图片chatroom.sendImage(name, to, image);}
}import java.text.SimpleDateFormat;
import java.util.Date;/*** 铂金会员** @author mendianyu*/
public class AdvancedMember extends Member
{public AdvancedMember(String name){super(name);}@Overridepublic void sendText(String to, String message){System.out.println("铂金会员发送文本:");//在消息后面加上时间SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");String timestamp = dateFormat.format(new Date());message += " [" + timestamp + "]";chatroom.sendText(name, to, message);}@Overridepublic void sendImage(String to, String image){System.out.println("铂金会员发送图片");chatroom.sendImage(name, to, image);}
}public class Client
{public static void main(String[] args){//实例化一个新的聊天室AbstractChatroom advancedChatroom = new AdvancedChatGroup();Member member1, member2, member3, member4, member5;member1 = new CommonMember("张三");member2 = new DiamondMember("李四");//实例化新的会员member3 = new AdvancedMember("王五");//加入聊天室advancedChatroom.register(member1);advancedChatroom.register(member2);advancedChatroom.register(member3);member1.sendText("李四", "干嘛呢你俩?");member1.sendText("王五", "干嘛呢你俩?");member2.sendText("张三", "我在写作业");//模拟图片超过20Mmember2.sendImage("张三", "11111111111111111111111111111");member3.sendText("张三", "我在打游戏");member3.sendImage("张三", "五连绝世");member1.sendText("王五", "别打游戏了,快出来玩");//文字长度超过100,发送失败member3.sendText("张三","1. 新的具体聊天室中发送的图片大小不得超过20M。\n" +"2. 新的具体聊天室中发送的文字长度不得超过100个字符。\n" +"3. 新的具体会员类可以发送图片信息和文本信息。\n" +"4. 新的具体会员类在发送文本信息时,可以在信息后加上时间。\n" +"修改客户端测试类,注意原有系统类代码和客户端代码的修改。");}
}

运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt自定义窗口,其绘制的窗口边框线显示不全

引言 自定义窗口,该窗口包含标题栏,默认整个窗口的边框线为蓝色,当点击该窗口的时候,窗口的边框线便为红色。程序在运行的时候,窗口的边框线只显示了左右两边的线,没有显示上下边的线。 示例 效果&#…

防火墙contos6.8操作手册

一、基本操作: 查看防火墙状态 service iptables status 停止防火墙 service iptables stop 启动防火墙 service iptables start 重启防火墙 service iptables restart 永久关闭防火墙 chkconfig iptables off 永久关闭后重启 chkconfig iptables on 二、查看…

漫画:996的本质是什么?

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!从前,有一个卖苹果的小贩,小贩每天都能拥有24个神奇的苹果。他…

qt整个窗口上绘制矩形与在窗口的子控件上绘制矩形

引言 创建一个基于QDialog的项目,自动生成ui文件,此时再添加新文件,创建一个基于QWidget的ui类,此类具有自定义标题栏,让该自定义类显示在窗口Dialog上,一开始具有红色的边框线,且四角围绕四个…

1分钟 Zookeeper 快速入门_windows环境

下载zookeeper 官网链接:https://zookeeper.apache.org/ 修改conf/zoo.cfg 文件名

跳槽季:跳和不跳之外的第三选择

戳蓝字“CSDN云计算”关注我们哦!作者:珍妮兔转自:轻松做软件每年的这个时候,都是跳槽的黄金季节。很多公司的招聘计划,也是在这个时间启动。今年的“跳槽季”,氛围却与往年不同。滴滴裁员2000,…

Dubbo Zookeeper Quick Start

新建一个父工程 选择Maven 快速构建项目 按图操作: 添加子项目(服务方) 添加子项目(消费方) 一个父工程,2个子项目(服务方,消费方),基本就完成了 在2个子项目中需要在main手动创建resour…

异构计算=未来?一文带你秒懂3大主流异构

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者:Pasca来源:蛋蛋团(ID:dandan_tuan…

Git Windows安装手册

文章目录1. 下载、安装、验证2、Next3. 选择安装位置4. 选择组件5. 创建开始菜单目录6. 选择Git使用的默认编辑器7 . Next8. 选择HTTPS传输后端9. 配置行结束转换10. Next11. 配置终端模拟器以与 Git Bash 一起使用12. git安装验证:1. 下载、安装、验证 git官网&am…

Nutanix,在转型的道路上越走越远 | 人物志

戳蓝字“CSDN云计算”关注我们哦!人物志:观云、盘点、对话英雄。以云计算风云人物为核心,聚焦个人成长、技术创新、产业发展,还原真实与鲜活!一年多以前,以超融合设备厂商之名起家的Nutanix,开始…

使用自己的域名解析CSDN博客

本文主要介绍怎样使用自己购买的域名指向CSDN博客 通常来说技术人员都会创建个自己的技术博客,总结下工作中的问题,经验等等,不过某些博客的访问链接的确是不太容易记忆或者输入,对我们分享造成一定的困扰,本文通过配置…

qt中设置QTabWidget,QGroupBox,QScrollArea的样式

引言 本文对标题中所述的三种控件的样式使用样式表来设置其外观。该样式表没有采用样式文件,而是在程序中直接使用函数setStyleSheet()来设置控件的样式。 前期准备 ui文件中各控件的结构如下图; 1.QGroupBox 从上面可以看到,QGroupBox属…

分布式精华问答 | 如何实现分布式系统的高可用性?

布式的处理方式越来越受到业界的青睐——计算机系统正在经历一场前所未有的从集中式向分布式架构的变革。今天,我们就来看看关于分布式的精华问答吧!1Q:什么是分布式缓存?A:为了提高性能和响应时间,在应用程…

qt将生成的程序打包在他人电脑上可用

引言 生成的可执行文件exe后,想在没有安装qtCreate编译器的电脑上用,这里可以使用qt自带的打包工具来添加所需的库到运行程序所在的目录。 步骤 将生成的exe文件拷贝到一个空文件夹下,若程序使用过程中用到其他项目成员的库文件&#xff0…

Guns 下载、导入、运行_入门试炼01

一、在码云搜索Guns下载项目解压: 码云Guns:https://gitee.com/stylefeng/guns 二、打开idea点击open选择guns文件夹,等一会,会出现: 三、配置Guns项目的数据库 在导入成功的“guns-admin”项目中,我们…

Docker 官方公共仓库 Docker Hub 遭攻击,恐19 万用户信息泄露;Intel 10核心新品要现身了?...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 新上的努比亚红魔3&#xff…

Guns 代码生成演示_入门试炼02

一、运行Guns idea运行springboot开源项目Guns: https://blog.csdn.net/qq_37164847/article/details/81701583 二、设计表结构 表结构: CREATE TABLE sys_house (id int(11) NOT NULL AUTO_INCREMENT COMMENT 房屋编号,house_user varchar(50) NOT…

qt点击按钮本身,来删除自身

引言 实现下面这样一个功能,点击界面的添加按钮,增加一行班级和学生的信息,刚才被点击行的按钮上的文字由添加变为删除,按钮文字为删除,点击的时候可以删除被点击行的所有控件,选中那个班级后会自动更新对…

强推!盘点阿里巴巴 15 款开发者工具 | 程序员硬核评测

戳蓝字“CSDN云计算”关注我们哦!程序员硬核评测:客观、高效、不说软话。无论是技术质量、性能水平,还是工具筛选,一测便知!从人工到自动化,从重复到创新,技术演进的历程中,伴随着开…

Guns 查询列表_入门试炼03

一、插入数据进行测试: INSERT INTO guns.sys_house (id, house_user, house_address, house_date, house_desc) VALUES (1949033474, 雨昕, 北京大兴区, 2019-05-30 17:20:25, 北京次渠南); INSERT INTO guns.sys_house (id, house_user, house_address, house_da…