第4章 结构型模式实训(4)
} //Getter方法和Setter方法省略 } //多媒体文件类:抽象享元类 (1) MultimediaFile { protected Size size; protected Location location; public abstract void display(); public void setSize(Size size) { this.size = size; } public void setLocation(Location location) { this.location = location; } } //图片文件类:具体享元类 class Image extends MultimediaFile { private String fileName; public Image(String fileName) { this.fileName = fileName; } public void display() { //导入和显示图片文件代码省略,在显示图片时将使用size和location对象 } } //动画文件类:具体享元类 class Animation extends MultimediaFile { //动画文件类代码省略 } //视频文件类:具体享元类 class Video extends MultimediaFile { //视频文件类代码省略 } //多媒体文件工厂类:享元工厂类 class MultimediaFileFactory { private Hashtable ht; //享元池 private int fileNum = 0; //享元对象计数器 public MultimediaFileFactory() { ht = (2) ; } //从享元池中获取对象 public (3) getMultimediaFile(String fileName) { //根据文件后缀名判断文件类型 String[] strArray = fileName.split(\ int ubound = strArray.length; String extendName = strArray[ubound-1]; if(ht.containsKey(fileName)) { return (MultimediaFile) (4) ; } else { if(extendName.equalsIgnoreCase(\ { MultimediaFile file = new Image(fileName); ht.put(fileName,file); fileNum++; } else if(extendName.equalsIgnoreCase(\ { MultimediaFile file = new Animation(fileName); ht.put(fileName,file); (5) ; } //其他代码省略 } } //返回享元对象数量 public int getFileNum() { return fileNum; } } class Test { public static void main(String args[]) { MultimediaFile file1,file2,file3,file4; MultimediaFileFactory factory; factory = new MultimediaFileFactory(); file1 = factory.getMultimediaFile(\ file1.setSize(new Size(300,400)); } } file1.setLocation(new Location(3,5)); file2 = factory.getMultimediaFile(\file2.setSize(new Size(300,400)); file2.setLocation(new Location(6,5)); file3 = factory.getMultimediaFile(\file3.setSize(new Size(200,200)); file3.setLocation(new Location(10,1)); file4 = factory.getMultimediaFile(\file4.setSize(new Size(400,400)); file4.setLocation(new Location(15,2)); System.out.println(file1==file2); //输出语句1 System.out.println(factory.getFileNum()); //输出语句2 在Test类中,“输出语句1”输出结果为 (6) ,“输出语句2”输出结果为 (7) 。
7. 某信息咨询公司推出收费的在线商业信息查询模块,需要对查询用户进行身份验证并记录查询日志,以便根据查询次数收取查询费用,现使用代理模式设计该系统,所得类图如图1所示:
Searcher+doSearch (): String...ProxySearcher-searcher: RealSearcher-validator: AccessValidator-logger: Logger+doSearch (): String+validate (): boolean+log (): void...AccessValidator+validate (): boolean...Logger+log (): void...图1 类图
RealSearcher+doSearch (): String... 在图1中,AccessValidator类用于验证用户身份,它提供方法validate()来实现身份验证;Logger类用于记录用户查询日志,它提供方法log()来保存日志;RealSearcher类实现查询功能,它提供方法doSearch()来查询信息。ProxySearcher作为查询代理,维持对RealSearcher对象、AccessValidator对象和Logger对象的引用。 【Java代码】 class AccessValidator { public boolean validate(String userId) { //身份验证实现代码省略 } } class Logger { public void log(String userId) { //日志记录实现代码省略 } } interface Searcher { public String doSearch(String userId,String keyword); } class RealSearcher implements Searcher { public String doSearch(String userId,String keyword) { //信息查询实现代码省略 } } class ProxySearcher (1) { private RealSearcher searcher = new RealSearcher(); private AccessValidator validator; private Logger logger; public String doSearch(String userId,String keyword) { //如果身份验证成功,则执行查询 if( (2) ) { String result = searcher.doSearch(userId,keyword); (3) ; //记录查询日志 (4) ; //返回查询结果 } else { return null; } } public boolean validate(String userId) { validator = new AccessValidator(); (5) ; } public void log(String userId) { logger = new Logger(); (6) ; } } class Test { public static void main(String args[]) { (7) ; //针对抽象编程,客户端无须分辨真实主题类和代理类 searcher = new ProxySearcher(); String result = searcher.doSearch(\ //此处省略后续处理代码 } } 4.3.3 综合题
1. 实现一个双向适配器实例,使得猫(Cat)可以学狗(Dog)叫,狗可以学猫抓老鼠。绘制相应类图并使用代码编程模拟。
2. 海尔(Haier)、TCL、海信(Hisense)都是家电制造商,它们都生产电视机(Television)、空调(Air Conditioner)、冰箱(Refrigeratory)。现需要设计一个系统,描述这些家电制造商以及它们所制造的电器,要求绘制类图并用代码模拟实现。
3. 某教育机构组织结构如下图所示:
北京总部教务办公室湖南分校行政办公室教务办公室长沙教学点湘潭教学点行政办公室教务办公室行政办公室教务办公室行政办公室
在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。
4. 某系统中的文本显示组件类(TextView)和图片显示组件类(PictureView)都继承了组件类(Component),分别用于显示文本内容和图片内容,现需要构造带有滚动条、或者带有黑色边框、或者既有滚动条又有黑色边框的文本显示组件和图片显示组件,为了减少类的个数可使用装饰模式进行设计,绘制类图并编程模拟实现。
5. 在电脑主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check()),CPU的运行(run()),硬盘(HardDisk)的读取(read()),操作系统(OS)的载入(load())等,如果某一过程发生错误则电脑启动失败。使用外观模式模拟该过程,绘制类图并编程模拟实现。
6. 在屏幕中显示一个文本文档,其中相同的字符串“Java”共享同一个对象,而这些字符串的颜色和大小可以不同。现使用享元模式设计一个方案实现字符串对象的共享 …… 此处隐藏:2810字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [资格考试]机械振动与噪声学部分答案
- [资格考试]空调工程课后思考题部分整合版
- [资格考试]电信登高模拟试题
- [资格考试]2018年上海市徐汇区中考物理二模试卷(
- [资格考试]坐标转换及方里网的相关问题(椭球体、
- [资格考试]语文教研组活动记录表
- [资格考试]广东省2006年高应变考试试题
- [资格考试]LTE学习总结—后台操作-数据配置步骤很
- [资格考试]北京市医疗美容主诊医师和外籍整形外科
- [资格考试]中学生广播稿400字3篇
- [资格考试]CL800双模站点CDMA主分集RSSI差异过大
- [资格考试]泵与泵站考试复习题
- [资格考试]4个万能和弦搞定尤克里里即兴弹唱(入
- [资格考试]咽喉与经络的关系
- [资格考试]《云南省国家通用语言文字条例》学习心
- [资格考试]标准化第三范式
- [资格考试]GB-50016-2014-建筑设计防火规范2018修
- [资格考试]五年级上册品社复习资料(第二单元)
- [资格考试]2.对XX公司领导班子和班子成员意见建议
- [资格考试]关于市区违法建设情况的调研报告
- 二0一五年下半年经营管理目标考核方案
- 2014年春八年级英语下第三次月考
- 北师大版语文二年级上册第十五单元《松
- 2016国网江苏省电力公司招聘高校毕业生
- 多渠道促家长督导家长共育和谐 - 图文
- 2018 - 2019学年高中数学第2章圆锥曲线
- 竞争比合作更重要( - 辩论准备稿)课
- “案例积淀式”校本研训的实践与探索
- 新闻必须客观vs新闻不必客观一辩稿
- 福师大作业 比较视野下的外国文学
- 新编大学英语第二册1-7单元课文翻译及
- 年产13万吨天然气蛋白项目可行性研究报
- 河南省洛阳市2018届高三第二次统一考试
- 地下车库建筑设计探讨
- 南京大学应用学科教授研究方向汇编
- 2018年八年级物理全册 第6章 第4节 来
- 毕业论文-浅析余华小说的悲悯性 - 以《
- 2019年整理乡镇城乡环境综合治理工作总
- 广西民族大学留学生招生简章越南语版本
- 故宫旧称紫禁城简介




