`
NanguoCoffee
  • 浏览: 51234 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

面向对象思维举例

阅读更多

我们经常有对图片进行处理的需求。本文就从最简单的要求到比较复杂的要求描述面向对象的抽象方式

下面假设调用方按照以下的协议进行调用:

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();逻辑特别清晰;极大程度上支持开-闭原则
 缺点:将会创造比较多操作类,换来的好处就是每个类(算法)都特别精炼。

0
0
分享到:
评论

相关推荐

    2023年面向对象程序设计的基本思想资料.doc

    1. 结识面向对象程序设计的基本思想和面向对象思想的由来,并可以举例说明现实世界与面向对象系统之间的相应关系。 2. 结识面向对象程序设计的优越性并初步理解其实现的机制。 二、教学重点 本节课的教学重点包括...

    类与对象的关系

    通过一系列的上机练习,学生将能够更加深入地理解和掌握面向对象的程序设计思维,并能够运用C#语言在***环境中编写面向对象的程序。实验报告要求学生对每个上机练习进行详细说明,包括分析过程、所用控件、事件过程...

    vs2008教程书籍(第三单元)

    与面向过程编程不同,面向对象编程(如C#)更加直观且易于理解,因为它的结构更接近人类思维。在面向过程编程中,程序由一系列按顺序执行的函数组成,而在面向对象编程中,数据和操作数据的方法被封装在一起,形成了...

    2019年面试宝典-阿里巴巴面经

    该文档全面覆盖了Java基础和面向对象编程的核心概念,旨在帮助求职者系统掌握所需知识点,提高面试成功率。 文档开篇提出面试者需准备自我介绍,以及概述自己做过的项目。这两个环节是面试的常见问题,通过这两部分...

    C++类与对象的修改

    面向对象程序设计(OOP)是一种模仿人类解决问题思维方式的编程范式。它将复杂的问题分解为一系列相互关联的部分,即对象,每个对象都包含了它的行为(behavior)和属性(attribute)。对象之间通过发送和接收消息来...

    中级系统集成项目工程师思维导图

    在信息系统开发中,有结构化开发、原型法、面向对象方法等,每种方法都有其优缺点,适用于不同类型的项目。 在方案设计阶段,会涉及总体设计和详细设计,包括系统、软件、数据库、人机界面等方面。软件工程的模型如...

    C++程序设计经典教程

    C++作为高级语言的一种,进一步引入了面向对象的概念,使得编程更加接近于人类思维。 面向对象编程(OOP)的核心在于对象,它代表了现实世界中的实体,包含静态特征(属性)和动态特征(行为)。属性是描述对象状态...

    《Java程序设计》第8章 类与对象教案.pdf

    【Java程序设计】类与对象是Java编程的核心概念,它们是面向对象编程的基础。...通过理论讲解、实例演示和互动讨论,期望使学生能够熟练掌握面向对象编程的核心技能,提高他们的编程能力和抽象思维能力。

    UML全程实作课件一 总览(1umlchina_overview.pdf)(彩色版)

    #### 一、UML与面向对象分析与设计概览 **UML(Unified Modeling Language)**,即统一建模语言,是一种标准化的图形化语言,用于描述面向对象系统的静态结构和动态行为。本课件旨在通过一系列教程帮助学习者全面...

    易学C++(编者语言通俗易懂,多举例说明,C++基础必备)

    C++是一种强大的、通用的编程语言,由Bjarne Stroustrup于1983年在C语言的基础上扩展而成,它既支持过程化编程,也支持面向对象编程。本书的特点在于用简洁易懂的语言解释复杂的概念,并通过丰富的实例来加深理解。 ...

    Java学习路线:day15

    模板方法设计模式(TemplateMethod)抽象类的练习接口(interface)概述举例接口的应用:代理模式(Proxy)接口的应用:工厂模式Java 8 中关于接口的改进类的内部成员之五:内部类匿名内部类局部内部类的使用注意面向对象...

    四元开放式教学法在Java教学中的研究与应用.pdf

    类比法是四元开放式教学法的重要组成部分,主要用于帮助学生理解 Java 中面向对象的概念并培养面向对象编程思维习惯。类比法主要使用学生比较熟悉的客观世界的事物来模拟、比喻和举例面向对象编程方法,从而达到教学...

    java基础资料大全

    9. 面向对象:解释面向过程与面向对象的概念,举例说明面向对象的思维方式,并探讨其好处。 10. 类与对象:讲解类的定义和对象的创建,并探讨如何在实际需求中使用对象。 11. 集合类:以ArrayList为例,介绍集合类...

    用java编写城镇大龄青年联谊会小游戏代码,并举例说明.docx

    对于初学者来说,这是一个很好的实践项目,可以帮助理解Java编程的基础知识并锻炼面向对象的思维。同时,这个游戏也可以作为进一步开发的基础,比如添加更复杂的交互功能,如私信系统、好友列表、聊天室等。

    Java课程教学方法探索.pdf

    引入项目驱动的案例教学,以项目为导向,以模块为驱动,围绕项目把语法和规则渗透到教学过程中,可以让学生更好地理解面向对象的概念和语法规则,提高学生的实用能力和逻辑思维能力。 Java课程教学方法探索是当前...

    duck project

    【标题】"鸭子项目"(Duck Project)是一个面向对象程序设计(OOPC)的概念演示,主要用于训练目的。这个项目可能包含了不同版本的代码实现,通过对比和学习,帮助初学者理解OOPC的核心概念和原则。 【描述】"鸭子...

    C#编程语言基础实验举例

    在IT领域,C#编程语言作为一种多功能、面向对象的编程语言,自2000年由微软推出以来,便迅速在软件开发行业中占据了重要的位置。它不仅继承了C和C++的强大功能,还融合了Java的一些特性,使得C#在语法上更加简洁、...

    VB类例子

    VB(Visual Basic)是微软公司开发的...如果你是VB的初学者,这个例子将是一个很好的起点,帮助你构建面向对象编程的思维,并熟练掌握VB中的类操作。通过实践和理解这些基本概念,你将能够逐步构建更复杂的VB应用程序。

Global site tag (gtag.js) - Google Analytics