我们经常有对图片进行处理的需求。本文就从最简单的要求到比较复杂的要求描述面向对象的抽象方式
下面假设调用方按照以下的协议进行调用:
ImageManager -src image_src_path -resize 100x200 -rorate 90 -...
-src表示来源图片
-resize 表示缩放
....
需求1:对图片进行缩放后存到指定的位置
解决方法:
很简单,只需要两个功能:缩放和存储图片的功能
代码1:
public void processImage(String imageSrc,int newWidth, int newHeight,String imageDest){
MyImage image = ... //读取来源图片
MyImage newImg = resize(image,newWidth,newHeight);
saveImage(newImage,imageDest);
//剩下的是释放资源的操作
}
private MyImage resize(MyImage image, int newWidth, int newHeigth){
//缩放的代码
}
private void saveImage(MyImage image, String destpath){
//存储的代码
}
需求2:对图片按照固定的顺序(缩放、旋转、剪切、锐化等,即命令行中resize 必须在 rorate之前)处理后保存新的图片
解决方法:
依然简单,按照代码1的逻辑添加新处理图片的方法即可
代码:
public void processImage(ImageInfo info){// 这里的info存放的是操作所需要的信息,比如旋转的角度等
MyImage image = ... //读取来源图片
MyImage newImg = resize(image,newWidth,newHeight);// 缩放
newImg = rorate(...);//旋转
newImg = cut(...);//剪切
newImg = sharpend(...)//锐化
//释放资源
}
需求3: 根据调用放输入命令的前后顺序对图片进行处理.
比如,输入-resize 100x200 -rorate 90 :缩放-> 旋转
输入-rorate 90 -resize 100x200 -cut 200x200 :旋转->缩放->剪切
解决方法:
最直接的方法: 先获取操作的前后顺序,然后if-else搞定
代码3.1:
public void processImage(ImageInfo info){// 这里的info存放的是操作所需要的信息,比如旋转的角度等
MyImage image = ... //读取来源图片
List<String> operateList = ...// 获取操作的先后顺序,放在数组中
for(String op : operateList){
image = process(op, ...);
}
//释放资源
}
public MyImage process(String op, ...){
if(缩放){
return resize(。。。)
}
if(旋转){
return rorate(..);
}
...
}
需求4:在需求3的基础上另外再加上10个操作。
解决方法4.1 :
在 public MyImage process(String op, ...)中添加新的if-else进行处理。
优点:很直观,很容易理解。
缺点:1:if太多
2:process方法过长
3:每添加一个一个新的操作就要修改原来的逻辑代码process(),这是非常危险的
解决方法4.2:
将对图片的操作抽象为一个接口:
interface ImageOperation{
operate(ImageInfo info);
}
class RorateOperation implements ImageOperation{
...
}
...
static{
map.put("rorate",new RorateOperation());
...
}
public void processImage(ImageInfo info){// 这里的info存放的是操作所需要的信息,比如旋转的角度等
MyImage image = ... //读取来源图片
List<String> operateList = ...// 获取操作的先后顺序,放在数组中
for(String op : operateList){
Operator p = getOperator(op);
p.operate(p);
}
//释放资源
}
public ImageOperation getOperator(String op){
return map.get(op);
}
好处:避免了过长的process();逻辑特别清晰;极大程度上支持开-闭原则
缺点:将会创造比较多操作类,换来的好处就是每个类(算法)都特别精炼。
分享到:
相关推荐
1. 结识面向对象程序设计的基本思想和面向对象思想的由来,并可以举例说明现实世界与面向对象系统之间的相应关系。 2. 结识面向对象程序设计的优越性并初步理解其实现的机制。 二、教学重点 本节课的教学重点包括...
通过一系列的上机练习,学生将能够更加深入地理解和掌握面向对象的程序设计思维,并能够运用C#语言在***环境中编写面向对象的程序。实验报告要求学生对每个上机练习进行详细说明,包括分析过程、所用控件、事件过程...
与面向过程编程不同,面向对象编程(如C#)更加直观且易于理解,因为它的结构更接近人类思维。在面向过程编程中,程序由一系列按顺序执行的函数组成,而在面向对象编程中,数据和操作数据的方法被封装在一起,形成了...
该文档全面覆盖了Java基础和面向对象编程的核心概念,旨在帮助求职者系统掌握所需知识点,提高面试成功率。 文档开篇提出面试者需准备自我介绍,以及概述自己做过的项目。这两个环节是面试的常见问题,通过这两部分...
面向对象程序设计(OOP)是一种模仿人类解决问题思维方式的编程范式。它将复杂的问题分解为一系列相互关联的部分,即对象,每个对象都包含了它的行为(behavior)和属性(attribute)。对象之间通过发送和接收消息来...
在信息系统开发中,有结构化开发、原型法、面向对象方法等,每种方法都有其优缺点,适用于不同类型的项目。 在方案设计阶段,会涉及总体设计和详细设计,包括系统、软件、数据库、人机界面等方面。软件工程的模型如...
C++作为高级语言的一种,进一步引入了面向对象的概念,使得编程更加接近于人类思维。 面向对象编程(OOP)的核心在于对象,它代表了现实世界中的实体,包含静态特征(属性)和动态特征(行为)。属性是描述对象状态...
【Java程序设计】类与对象是Java编程的核心概念,它们是面向对象编程的基础。...通过理论讲解、实例演示和互动讨论,期望使学生能够熟练掌握面向对象编程的核心技能,提高他们的编程能力和抽象思维能力。
#### 一、UML与面向对象分析与设计概览 **UML(Unified Modeling Language)**,即统一建模语言,是一种标准化的图形化语言,用于描述面向对象系统的静态结构和动态行为。本课件旨在通过一系列教程帮助学习者全面...
C++是一种强大的、通用的编程语言,由Bjarne Stroustrup于1983年在C语言的基础上扩展而成,它既支持过程化编程,也支持面向对象编程。本书的特点在于用简洁易懂的语言解释复杂的概念,并通过丰富的实例来加深理解。 ...
模板方法设计模式(TemplateMethod)抽象类的练习接口(interface)概述举例接口的应用:代理模式(Proxy)接口的应用:工厂模式Java 8 中关于接口的改进类的内部成员之五:内部类匿名内部类局部内部类的使用注意面向对象...
类比法是四元开放式教学法的重要组成部分,主要用于帮助学生理解 Java 中面向对象的概念并培养面向对象编程思维习惯。类比法主要使用学生比较熟悉的客观世界的事物来模拟、比喻和举例面向对象编程方法,从而达到教学...
9. 面向对象:解释面向过程与面向对象的概念,举例说明面向对象的思维方式,并探讨其好处。 10. 类与对象:讲解类的定义和对象的创建,并探讨如何在实际需求中使用对象。 11. 集合类:以ArrayList为例,介绍集合类...
对于初学者来说,这是一个很好的实践项目,可以帮助理解Java编程的基础知识并锻炼面向对象的思维。同时,这个游戏也可以作为进一步开发的基础,比如添加更复杂的交互功能,如私信系统、好友列表、聊天室等。
引入项目驱动的案例教学,以项目为导向,以模块为驱动,围绕项目把语法和规则渗透到教学过程中,可以让学生更好地理解面向对象的概念和语法规则,提高学生的实用能力和逻辑思维能力。 Java课程教学方法探索是当前...
【标题】"鸭子项目"(Duck Project)是一个面向对象程序设计(OOPC)的概念演示,主要用于训练目的。这个项目可能包含了不同版本的代码实现,通过对比和学习,帮助初学者理解OOPC的核心概念和原则。 【描述】"鸭子...
在IT领域,C#编程语言作为一种多功能、面向对象的编程语言,自2000年由微软推出以来,便迅速在软件开发行业中占据了重要的位置。它不仅继承了C和C++的强大功能,还融合了Java的一些特性,使得C#在语法上更加简洁、...
VB(Visual Basic)是微软公司开发的...如果你是VB的初学者,这个例子将是一个很好的起点,帮助你构建面向对象编程的思维,并熟练掌握VB中的类操作。通过实践和理解这些基本概念,你将能够逐步构建更复杂的VB应用程序。