从一个JAVA程序谈面向对象思想的建立

题目:在图形接口画出四方形、圆形与三角形。当用户点选图形时,图形需要顺时钟转360度并依据形状的不同播放不同的AIF音效文件。
 
面向过程的思考方法:这个程序要执行什么动作?我会需要什么样的程序?
结论:我需要rotate与playSound
 
面向对象的思考方法:这个程序有什么样的事物?有什么关键角色?
结论:三种shape
 
面向过程编程伪码:
rotate(shapeNum){
//旋转360度
}
playSound(shapeNum){
//查询播放哪个AIF文件
//播放
}
 
面向对象编程伪码:
对3个形状各写一个类
Square类包括rotate(){}和playSound(){}
Circle类包括rotate(){}和playSound(){}
Triangle类包括rotate(){}和playSound(){}
 
如果题目不变,则面向过程编程效率是高的,因为它只完成了两个函数的构造,而面向对象的方法要完成6个。
但这时用户说需求有一点点变化:加上阿米巴原虫形状,点选时也是旋转并播放.hif声音文件。
 
此时面向过程方法遇到了如下问题:
1  两个函数是否还可以继续用?是否需要修改?
2  对于不同声音格式的文件如何作处理?
 
解决方法如下:
playSound(shapeNum){
//如果不是阿米巴原虫
    //查询使用哪个AIF文件
    //播放
//不然
    //播放amoeba.hif
}
 
而面向对象的方式不用去修改原有的类,直接写一个新的类就好了:
Amoeba类包括rotate(){}和playSound(){}
 
现在用户需求又改了,阿米巴原虫的旋转方式与其他三种形状有所不同。
 
其他三种形状的旋转方式为:
1  找出指定形状的外接四边形
2  计算出四边形的中心点,以此点为轴作旋转
阿米巴原虫的旋转方式为:绕着一端旋转
 
面向过程的函数又要作修改:
rotate(shapeNum,xPt,yPt){
//如果不是阿米巴
    //计算中心点
    //然后旋转
//否则
    //以xPt和yPt作为旋转中心
    //然后旋转
}
 
面向对象的方式只需要修改阿米巴原虫类即可:
int xPoint
int yPoint
rotate(){
//使用阿米巴的x和y
//执行旋转
}
playSound(){
//播放
}
 
此时由于面向对象方法的多各类中存在相同处理过程的方法,故可以提炼出一个父类Shape,它具有rotate()方法和playSound()方法,此时,4个子类会自动获得父类的功能,并且Amoeba类会override父类的两个方法,效率得到提升,而且设计层次清晰。

你可能感兴趣的:(java,面向对象,职场,休闲)