采用模式思维方式引导面向对象的程序设计

2018-09-10 05:49汤谷云
企业科技与发展 2018年2期
关键词:设计模式面向对象

汤谷云

【摘 要】面向对象软件设计时,关键是构建合适的类及确定各个类之间的结构关系。设计模式在某种程度上来说就是引导创建合适的类,确定合理类间关系的模板。在实践过程中,结合实际应用,采用模式思维方式引导,对分析找到合适的类,选择合理的类间关系来实现面向对象的程序设计起到了非常好的效果。掌握设计模式的思想为设计出可复用易维护面向对象程序提供了重要的思考方向,对强化面向对象思想,建立合理的面向对象程序架构提供了重要保证。

【关键词】设计模式;面向对象;功能类;类间关系

【中图分类号】TP311 【文献标识码】A 【文章编号】1674-0688(2018)02-0161-03

0 引言

面向对象的程序设计的比较重要的思路在于设计类并确定类间的关系。面向对象的应用程序一般应由多个类构成,这多个类划分成两大块,如图1所示。

其中,主类决定了程序运行时的界面(图形界面或字符界面),通常称主类为用户逻辑(或界面逻辑),而系统中其他非主类能完成一定的功能称为业务逻辑,也可称为功能类。在实践过程中,一个软件系统需要多个功能类,而多个功能类不能是一盘散沙,必须有一个合理的组织结构才能稳定并发挥各自的作用,这跟日常生活中各种单位部门间都有一个合理的组织结构意义相同。因此,从功能类这一部分来说先要有一个合理的组织结构,这就是让各个类之间建立起一定的关系。

1 类间关系分析

确定类间的关系是面向对象程序设计的一个难点。类的关系建立起功能类间的组织结构,使各个类各行其职,协同工作,完成任务。类间的关系有泛化、实现、依赖、关联,关联又可以进一步细化为聚合和组合。如果不能确定一个关系是聚合关系或者组合关系,可以把这两种关系归结成关联关系;以Java为例,实现关联、聚合和组合关系时,它们的语法特征都是一样,都表现为一个类是另一个类的属性。

从Java语法角度来看,关联关系表现为一个类是另一个类的属性,依赖则表现为一个类是另一个类中方法的局部变量或参数。确定类间的关系是关联还是依赖有时不影响程序的执行,甚至对程序的质量影响也不大,这就造成了对两种关系使用的不确定性。实际上,要准确地使用这两种关系,必须认清关系的本质。若干年前,中国是一个自行车的王国,大多数人都拥有属于自己的自行车,这时人和自行车的关系可以理解成一种关联关系,而如今共享单车的出现使得个人不必拥有自己的自行车,但是在需要的时候可以使用共享自行车,用完之后共享自行车又和自己无关了,这时人和自行车的关系就可理解成依赖关系。也就是说,自行车属于自己的,可以长期使用就是关联关系。自行车是借来用,它不属于自己,只能是暂时使用一下,就是一种依赖关系。

同样从Java语法角度来看,理解泛化、实现关系比较容易和直接,分别用关键词extends和implements完成关系的确定。与关联和依赖类似,究竟使用泛化还是实现,同样在某些时候选择任何一种也是不影响程序质量与执行的,实际项目设计时也存在着一种不确定性,因此必须从语义上来理解泛化和实现关系。在Java中,泛化关系是一种层次的结构,顶层往往是从Java抽象类开始的,而实现关系也是一种层次结构,而它的顶层是从Java接口开始的。

上述两图中的实现关系中顶层为接口,它针对的下层类之间可以是相关的类,如图2所示;也可以是毫不相干的类,如图3所示;但对于泛化关系来说,下层类之间是有一定相关性的,也就是说图2的接口IAction是可以用抽象类来替代,而图3中的接口Ifuncation用抽象类替代演变成泛化关系是不合适的。由此可见,实现关系比泛化关系具有更好的扩展性。

2 利用模式思维解决难点

在进行面向对象软件设计时,其中一个难点是去发现合适的类。要从一个具体的应用项目中去分析和找到合适的类,另一个难点是确定各个类之间的结构关系,这些决定了一个系统的可复用、易维护等特性。而设计模式就是记录面向对象软件的设计经验,每个设计模式是针对某类问题解决方案,实际上就是引导如何创建合适的类,如何确定类间关系的模板。在软件设计过程中,并不是每个项目都必须套用设计模式,都有合适的设计模式来解决,但在熟悉了设计模式思想并了解了一些模式后,就能运用模式思想和方法来引导设计,准确地发现合适的类,选择合适的类间关系。以下面的实际问题为例,结合具体的设计模式进行引导分析。

某高校教师指导毕业设计论文工作量的计算办法折合标准课时Y2:

NΧW N0≤N

Y2=N0ΧW+(N-N0)ΧWΧ0.8 N01.4N0ΧW+(N-1.5N0)ΧWΧ0.5 1.5N0

public float getWorkLoad(int num,int n0){

float y2=0.0f;

y2=num*W;

return y2;

}

}

class T2 implements TeachingLoad{

public float getWorkLoad(int num,int n0){

float y2=0.0f;

y2=n0*W+(num-n0)*W*0.8f;

return y2;

}

}

class T3 implements TeachingLoad{

public float getWorkLoad(int num,int n0){

float y2=0.0f;

y2=1.4f*n0*W+(num-1.5f*n0)*W*0.5f;

return y2;

}

}

class T {

TeachingLoad teacher;

int flag;//表示文科或理科

int n0;

int num;//表示实际带的学生人数

public T(int flag,int num ){

if(flag==0)

n0=8;

if(flag==1)

n0=6;

this.num=num;

}

public float getArithmetic()

if(num<=n0)

teacher=new T1();

else if(num<=1.5f*n0)

teacher=new T2();

else if(num<=2*n0)

teacher=new T3();

return teacher.getWorkLoad(num,n0);

}

}

从类图中可以看出,这种设计方法满足了软件设计的开闭原则,TeachingLoad接口起到了稳定系统的作用,实现了可复用,它的实现类T1、T2、T3满足了不同的用户需求,同时方便插拔操作,相互之间不受影响,实现了易维护。

3 总结

如果不以设计模式为引导,这类问题常规的解决办法如图5所示。

class TeachingLoad{

final int W=8;

public float getWorkLoad(int num,int n0){

float y2=0.0f;

if(num<=n0)

y2=num*W;

else if(num<=1.5f*n0)

y2=n0*W+(num-n0)*W*0.8f;

else if(num<=2*n0)

y2=1.4f*n0*W+(num-1.5f*n0)*W*0.5f;

return y2;

}

}

这样的架构尽管体现出了一部分面向对象的思路,但其中缺失了软件设计的原则:如开闭原则、面向抽象、面向接口编程等。设计模式是面向对象软件的设计经验,每个设计模式是针对某类问题解决方案,借助于设计模式,可以合理地从问题中提取合理的类,确定合适的类间关系,从而快速完成设计,是提高代码质量的重要途径。需要说明的是,实际应用中并不是每个项目都必须套用设计模式,都有合适的设计模式来解决,但在熟悉了设计模式思想并了解了一些模式后,对强化面向对象思想,建立合理的面向对象程序架构提供了思路,对提升程序的可复用易维护特性提供了重要保证。

参 考 文 献

[1]耿祥义.Java2实用教程[M].第5版.北京:清华大学出版社,2017.

[2]于卫红.Java设计模式[M].北京:清华大学出版社,

2016.

[3]王宗亮.Java程序設计任务驱动式实训教程一[M]. 第2版.北京:清华大学出版社,2016.

猜你喜欢
设计模式面向对象
GEE平台下利用物候特征进行面向对象的水稻种植分布提取
基于深度学习与融合地形特征的黄土陷穴面向对象提取方法
“1+1”作业设计模式的实践探索
智慧图书馆环境下的融贯式服务设计模式研究
信息化教学模式构建研究
设计模式对软件可维护性影响的定量研究
基于Web的科研项目管理系统的设计与实现
IEC61850在电能量管理系统通信中的应用
高职计算机专业的一次信息化教学单元设计
从面向过程到面向对象思维方式的教学引导