图片读取器和皮肤库设计

无论是图片读取器还是皮肤库设计,其实只是点到为止,没有深入做出很好的视觉效果,请见谅。

一、实验目的

1.结合实例,熟练分析并绘制UML类图;

2.熟练使用java实现两种常见的创建型设计模式,包括工厂方法模式、抽象工厂模式。理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。

二、实验要求

  1. 结合实例,正确无误地绘制工厂方法模式、抽象工厂模式的模式结构图;

  2. 要求使用XML和Java反射机制来创建对象。

  3. 使用Java语言实现工厂方法模式、抽象工厂模式实例,代码运行正确无误。

、实验原理

​ 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

​ 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

四、实验步骤、数据记录及处理

1.图片读取器

​ 使用工厂方法模式设计一个程序用来读取各种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),例如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器 (JpgReader)用于读取JPG格式的图片。需充分考虑系统的灵活性和可扩展性。

使用工厂方法模式设计一个程序用来读取各种不同类型的图片格式,针对每一种图片格式都设计一个 图片读取器(ImageReader),例如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。需充分考虑系统的灵活性和可扩展性。

分析:用抽象工厂imageReaderFactory去生产抽象的图片读取器(ImageReader),由于GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器 (JpgReader)用于读取JPG格式的图片。所以得有GifReadFactory和JpgReadFactory这两个工厂以达到产生不同类型的图片读取器。考虑到系统的灵活性和可扩展性,则需要将抽象工厂imageReaderFactory和图片读取器(ImageReader)定义为接口的形式。例如增加PNG图片读取器用于读取PNG格式的图片,只需要实现相应的ImageReader接口和ImageReader Factory接口,增加相应的工厂和图片读取器,没有对原有业务造成影响。客户端Client调用不同的图片读取器读取相应图片的信息。XMLUtil则是运用反射机制提供工厂实例化方法getBean()

根据工厂方法模式用rational rose对题设内容进行uml建模,类图如下所示。

那么如何实现不同读取器的调度呢?

这就取决于工厂生产哪个图片读取器。这样就从图片读取器的调度转换到不同工厂之间的调度。我们通过改变工厂注册文件config.xml来实现。

2.皮肤库

某软件公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化。不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构如下图所示:

该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。试使用抽象工厂模式设计该皮肤库,绘制类图并编程模拟实现。

分析:抽象皮肤库工厂可以生产多种结构的产品,按钮,文本框,组合框,而每个具体工厂可以生产出同种产品,不同结构的产品,即Spring风格和Summer风格属于不同的具体工厂的产品。

根据抽象工厂模式用ratioal rose 对题设内容进行uml建模,类图如下所示

考虑到要实现不同的按钮,文本框,组合框,所以每个继承JFrame类。

五、实验中所出现的问题及解决方案

图片读取器

(1) 配置文件路径不对,这将会导致工厂无法注册?

根据idea控制台打印的路径对比自己填写的路径改正。

(2) 图片格式如何判断?

通过查找资料,发现jdk类库中提供有图片输入流,然后再用迭代器决解。

(3) 图片信息如何判断?

类库中提供有ImageIo,可以读取图片信息。

皮肤库

(1) 如何实现不同颜色的按钮、绿色边文本框、绿色边框组合框?

通过查找资料,以依赖注入的方式,添加按钮JButton,组合框JComBox,文本框JTextField。不同颜色的边框设置方法:

​ setBorder ( BorderFactory.createLineBorder ( Color.GREEN,5 ) )

六、实验结果

(1)图片读取器

Gif图片读取器工厂注册

选择图片cat.gif,输出结果

Jpg图片读取器工厂注册

选择图片2.jpg,输出结果

(2)皮肤库

Spring风格的工厂注册

结果展示

从左到右依次是SpringButton、SpringTextBox、SpringComboBox。

Summer风格的工厂注册

结果展示

七、实验心得

图片读取器

首先加深了对设计模式的理解,我认为设计模式是编程套路,这些编程套路从结构上大致是不会改变的,既然是不变的,那么照着这种固定结构,只要完成uml建模,画出类图,那么完成编程是比较容易的。接着谈谈本例应用工厂方法模式解决的看法,联系实际,不同的图片读取器又怎么会在不同的工厂中生产呢?一般地,都会是一个工厂生产出不同的图片读取器,所以我觉得这里用图片读取器案例理解工厂方法模式是有待商榷的。

接着对于工厂方法模式的结构更加深刻。最后就是对于实现实例化的getBean()方法,应用dom模型读取配置文件,积累更多思路。

皮肤库

当用抽象工厂模式实现皮肤库的基本框架后,就是ui处理,抽象工厂模式与工厂方法模式更具有实际意义。

八、项目结构

图片读取器

皮肤库

九、待改进问题

​ 1.实际上在图片读取器中,ImageFormat类可以读取各种格式的图片,让具体图片读取器继承它,就显得有些大材小用,窄化功能的意味。

​ 2.在实现皮肤库中,让每个具体组件继承JFrame,显然组件之间的耦合增加了。

十、源代码

源码地址

图片读取器和皮肤库设计相关推荐

  1. TensorFlow-谷歌深度学习库 数据读取器

    先介绍一下TensorFlow自带的数据格式: TensorFlow自带一种数据格式叫做tfrecords. 你可以把你的输入转成专属与TensorFlow的tfrecords格式并保存在本地. -关 ...

  2. 【第二讲】搭建界面,Excel读取,图片读取 -【Python动画设计教程】

    [Python动画设计教程]系列文章目录 [第一讲]软件准备 [第二讲]搭建界面,Excel读取,图片读取 [第三讲]图像绘制 [第四讲]制作动画 文章目录 1 搭建Qt界面 1.1 搭建界面 1.2 ...

  3. VC界面设计(破解版skin++皮肤库使用)

    VC界面设计(破解版skin++皮肤库使用) skin++可以使VC++等工具写的软件的界面很漂亮,但是试用版在运行时会跳出注册框,正式版又需要花钱,下面的这种方法将会使注册窗口不再跳出来.     ...

  4. 图片播放器的实现1——利用Image2LCD提取图片数据并显示

    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 参考内容 (1)https://xiefor100.blog.csdn.net/article/details/71941527 (2) ...

  5. 【React组件】写一个模仿蓝湖的图片查看器

    前言 最近公司让写一个可以自由拖拽放大的图片查看器,我寻思这还不简单,一顿操作猛如虎,俩小时后: 事实证明,一旦涉及到 DOM 的变换操作,如果很多细节考虑不全,抓过来就写,那基本就凉了.于是我仔细分 ...

  6. AI也会查水表啦!德国小哥开发水表读取器,可OTA升级,成本不到80元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 不少人家里应该都还有这种老式水表,但你能看懂它的读数吗? 恐怕不少人都会感到一脸懵逼.机械式水表可能是最反人类的设计之一了,安装在阴暗的角 ...

  7. python写gui导入图片并处理_Python图像处理库:Pillow 初级教程

    Image类 Pillow中最重要的类就是Image,该类存在于同名的模块中.可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片. 使用Image模块中的open函数 ...

  8. Android 图片压缩器

    概述 Android 图片压缩器:一款高效的图片压缩器库,支持批量压缩,异步压缩.多线程多任务压缩,压缩比设置等特性. 详细 代码下载:http://www.demodashi.com/demo/12 ...

  9. [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧

    [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧 原文:[开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧 不知不觉又半个月没有更新博客了,今天终于抽出点时间,来分享 ...

最新文章

  1. 云上护航服务—保障云上的尖峰时刻
  2. 给table里面的添加图标_刺激!微信“变色”了!换个带quot;色quot;的图标吧
  3. python学生类出不来中文_求教Python中文编码望大神给解答
  4. EOS从入门到精通-账户体系(文字稿)
  5. 外星人颜色python练习_都来说一说你们都是如何自学Python的呀?
  6. 注册窗口类 registerclass
  7. Android多媒体学习五:调用Android自带的播放器播放Audio
  8. spring boot使用注解的方式整合mybaits
  9. jeecg怎么样好用吗?
  10. c语言课后答案谢延红,C语言程序设计基础第4,5章 课后习题答案
  11. Google TakeOut图片下载器
  12. mysql数据库任务驱动式教程课后答案_MySQL数据库任务驱动式教程
  13. bzoj 1015: [JSOI2008]星球大战starwar
  14. mysql如何让自增id从1开始设置方法
  15. java exchangedeclare_Exchange服务器之RabbitMQ四种Exchange类型之Topic (Java)
  16. Spring入门篇——第4章 Spring Bean装配(下)
  17. 【C语言】之冒泡排序法(详解)
  18. (原创)十大危险cmd命令代码总结
  19. 阿里云DataV数据可视化工具的简单使用与地图组件区域下钻热力图下钻上钻控制缩放比例demo
  20. 微信小程序 display: flex 与inline-flex的区别以及应用

热门文章

  1. 基于python可视化的网页搜索引擎设计#毕业设计
  2. py218-基于Python+django的化妆品美妆销售商城网站#毕业设计
  3. layui单选框verify_layui 实现自动选择radio单选框(checked)的方法
  4. 用SQL语句查询一个特定老师学生中男生女生各多少人
  5. 【php毕业设计】基于php+mysql的成绩查询系统设计与实现(毕业论文+程序源码)——成绩查询系统
  6. table表格模板(自用)
  7. centos7 KVM网桥桥接、网卡绑定
  8. 字母大小转换及其十进制的ASCLL码值
  9. AE基础教程第一阶段——05时间,快照命令
  10. 小米3 android8,小米8 Miui10.3 最新稳定版(10.3.6.0 Android 9.0)稳定版 快过闪电 AI加持 高级工具箱 黑域 精简 流畅 省电 实用...