APP下载

设计模式之状态模式在C++教学中的运用

2016-11-30王金娟彭浩

计算机时代 2016年10期
关键词:设计模式面向对象语言

王金娟 彭浩

摘 要: 针对C++语言程序设计课程教学出现的问题,提出引入部分设计模式的思想讲解面向对象的编程思想,给出在教学过程中讲解抽象类与纯虚函数概念引入状态模式的案例。从教学实践效果来看,这种教学方法提高了学生的学习积极性,提高了学生的实际编程能力和计算机思维能力。

关键词: C++语言; 设计模式; 状态模式; 面向对象

中图分类号:G642 文献标志码:A 文章编号:1006-8228(2016)10-90-03

Application of state pattern in C++ language teaching

Wang Jinjuan, Peng Hao

(Hunan International Economics University, Changsha, Hunan 410205, China)

Abstract: According to the present problem of the C++ language course teaching, this paper puts forward an argument of introducing some ideas of design pattern to explain the programming thought of object-oriented, and gives an example case that the state pattern is introduced to explain the concepts of abstract class and pure virtual function in the teaching process. From the practical teaching effect, the teaching method has increased the students' learning enthusiasm, and improved the students' practical programming ability and computer thinking.

Key words: C++ language; design pattern; state pattern; object-oriented

0 引言

C++语言程序设计是大部分计算机学科的专业基础课,它同时也是学习面向对象编程思想的重要课程。它的先导课程C语言是一种纯粹面向过程的语言,侧重算法的设计、功能的实现,强调函数之间调用。由于C++语言完全兼容C语言面向过程特性,所以它涵盖了面向过程与面向对象两部分内容[1],相较于纯粹的面向对象语言,比如Java语言注重分析抽取类、建立模型设计类之间的关系,设计各个类的成员变量、成员函数,通过类与类之间的相互协调完成任务,这与面向过程的思想大为不同。

在教学中发现,大多数学生更习惯于用面向过程的设计思路,首先设计函数功能及相关算法,再把所有的函数放在一个类中,这些函数都是静态的,虽然有一个类,但并没有类的设计,也没有体现面向对象的设计思想[2]。仔细分析发现,由面向过程的编程转为面向对象的编程,存在计算思维上的转换和跳跃,这种跳跃无论对于学生还是教师都需要认真思索。面向对象编程思想更加抽象,理解起来更困难,而面向对象编程思想中又包含了面向过程的基本编程模式,如成员函数的定义、成员属性的定义,这会使学生感觉面向对象编程就是把变量放在类里面,就是多了一个类的框架而已。在介绍封装、继承、多态这三个面向对象编程最重要的三大知识点时,教材上的实例显得简单,无法加深对于类和对象概念的深入理解,最终导致学生在糊里糊涂的状态下采用C语言的代码风格写出了C++的类。

针对这样的教学困境,我们尝试将设计模式的部分思想如状态模式,引入C++面向对象程序设计的教学中,设计模式是培养面向对象计算思维的一个良好途径,是一套被反复使用、经过分类编目的代码设计经验的总结[3]。经过几学期的教学实践表明,在C++面向对象程序设计的教学过程中引入部分设计模式相关内容,能提高他们举一反三的学习能力[4],非常有助于加深学生对面向对象程序设计思想的理解。

1 教学方案设计

软件设计模式,经过分类编目归纳为创建型、结构型和行为型共三大类23种模式,且还在不断发展。它反应了面向对象设计思想在软件设计过程中如何重复使用,并能以此构造出程序的良好结构,每个设计模式的说明有名称、意图、实用性、结构、效果、实现方法、代码示例等[5],这些设计方法可以让开发者深入了解面向对象思想的精华。

学习设计模式在C++教学过程中并不是教学核心,学生不需要学习和掌握全部设计模式,而是选择适当的模式在适当的时候引入课堂教学,这需要遵循一定的教学方法。首先,将原先注重讲解语法的教学模式,改变为案例驱动型教学模式。案例驱动模式,不再单一地讲解一个知识点,而是改成提出一个主题,设计相关的类和功能,可以运用一些方法如设计模式中的一些适合这个主题的某一种模式,然后围绕着这个模式讨论可行的解决方法,此时可以介绍这种模式的基本思想,但是不用深入讨论概念的描述,这对于初学者不太适合。其次,介绍区别于流程图的UML类图,画图是大多数学生比较感兴趣的一项任务,引导学生把讨论的方案用图表达出来,在画图的过程中穿插讲解类于类之间的关系,不理解的类或者关系应该多次讨论再要求学生画出来,尽量做到生动有趣,以帮助理解类和对象是动态的而非静态的思想。最后,引导学生将前两步的工作建立一个工程完成相应的代码编写,并让学生自己做总结。教师对本次讨论的主题进行讲评。

2 状态模式在教学中的案例运用

案例驱动型教学模式是这次教学改革的主要任务,教师在课堂上提出一个讨论主题案例,讲解基础知识,学生回答问题并讨论,在结合某种经典设计模式讲解,这样不仅加深了学生对与继承、多态、封装、虚函数等概念的理解,也大大提高了学生自由思考,举一反三的能力,对于编程的能力也上了一个新的台阶。

这里以讲解面向对象中较难理解的抽象类和纯虚函数的教学过程为例,本节教学目标是通过引入设计模式中的状态模式让学生了解抽象类的概念、纯虚函数的用途。

⑴ 案例引入:某公司力排万难终于获得某个酒店的系统开发项目,最终交由你负责。图1是系统的主要工作,每个框都代表了酒店房间当前状态,箭头表示房间状态的转换。分析如下:房间有三个状态,即空闲、已预订、已入住;状态与状态之间可以根据客户的动作来进行转换。

⑵ 提出问题:定义一个房间Room类,如何将房间的每个状态整合起来?许多同学迅速反应,这个“最简单”就是if…else if…else,先设置房间三个状态的静态变量:空闲状态FREEMTIME_STATE=0、已预订状态BOOKED_STATE=1、已入住状态CHECKIN_STATE=2,并给出四个动作对应的函数:预订、入住、退订、退房。以下列出预订函数的伪代码,并如法炮制出了类似的其他三个功能函数:

void Room::bookRoom() { /*预定*/

if(state==FREEMTIME_STATE) { //空闲可预订

if(count>0) {

cout<<"房间空闲,完成预订"<

state=BOOKED_STATE; //改变房间状态:已预订

count --;

if(count==0) {

cout<<"不好意思,房间已订完,欢迎您的下次光临!"<

}

}

else {

cout<<"不好意思,房间已订完,欢迎您的下次光临!"<

}

}

else if(state==BOOKED_STATE) {

cout<<"该房间已经被预定了"<

}

else if(state==CHECKIN_STATE) {

cout<<"该房间已经有人住了"<

}

}

⑶ 状态模式的引入:这个复杂的if…else if…else你是否满意?这个不是C语言的代码吗?哪里体现了面向对象?如果客户要求将某些房间保留下来以作为备用怎么办?于是,悲剧就发生了,这就必须要在所有的操作里都要判断该房间是否为备用房间,这对于代码的改变量太大了,也体现出一开始的设计出现了严重了问题。这个时候需要换一个角度思考,以状态为原子来改变它的行为,而不是通过行为来改变状态,这就是设计模式里的状态模式。

状态模式是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。一个对象的行为取决于它的一个或多个变化的属性,这些属性我们称之为状态,这个对象称之为状态对象。对于状态对象,它的行为依赖于它的状态,比如现在这个案例中的预订房间,只有当该房间为空闲时才能预订,入住该房间的条件也只有预订了该房间或者该房间为空闲时。对于这样的一个对象,当它在与外部事件产生互动的时候,其内部状态就会发生改变,从而使得其行为也随之发生改变,和学生一起设计类的UML如图2。

⑷ 抽象类和纯虚函数:如何完成这个工程,可以设计一个专门描述状态的抽象类State,它包含了预订房间bookRoom()、入住checkInRoom()、退房checkOutRoom()及取消预订cancel()四个虚函数;Room类里包含State类的三个对象空闲状态State freeTimeState、入住状态State checkInState、预订状态State bookedState;再具体实现三个空闲、预订、入住状态类,下面给出预订状态的部分伪代码:

class FreeTimeState:public State {

Room hotelManagement;

FreeTimeState(Room hotelManagement)

{ this.hotelManagement=hotelManagement; }

void bookRoom() {

cout<<"您已经成功预定了!"<

hotelManagement.setState(hotelManagement.getBookedState()); //状态改为已预订

}

void checkInRoom() {

cout<<"您已经成功入住了!"<

hotelManagement.setState(hotelManagement.getCheckInState()); //状态改为已入住

}

public void checkOutRoom() { } //为空,不需要实现

}

⑸ 总结:明确抽象类和纯虚函数的实际意义,与普通类于函数的区别在哪里。状态模式可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数,特别适合代码中包含大量与对象状态有关的条件语句。这种方法让多个环境对象共享一个状态对象,从而减少系统中对象的个数,极大提高了代码编写的质量。

3 结束语

在每一次的课程讲授过程中,都努力引导学生结合已经掌握的语法知识从多个角度进行面向对象的编程思维训练。反复通过这样的案例教学研究发现,在C++语言程序设计课程中适当引人设计模式知识的教学模式,对于讲解抽象的面向对象编程思想又很大帮助,它将设计模式知识与面向对象语法相结合,锻炼了学生整合新旧知识的能力,锻炼了他们的计算思维能力,逐步养成良好的编程规范。通过实践证明,这种教学方式取得初步成功,也得到学生良好的评价,但是对于基础薄弱,不能很好的连接新旧知识的学生,如何更好地设计案例,启发他们的计算机思维能力,仍然需要继续研究探索。

参考文献(References):

[1] 章品正,於文雪.设计模式在C++课程教学中的运用[J].计算

机教育,2014.14:41-45

[2] 杨瑞龙,朱征宇,朱庆生.引入软件设计模式的面向对象程序

设计教学方法[J].计算机教育,2012.10:97-100

[3] Erich G,Richard H,Ralph 1,et al著.李英军,马晓星,蔡敏等

译.设计模式:可复用面向对象软件的基础[M].机械工业出版社,2004.

[4] 向华.如何在C++教学中引入初步的设计模式思想闭[J].长

江大学学报(自然科学版),2009.6(2):388-389

[5] 刘海岩,锁志海,吕青等.设计模式及其在软件设计中的应用

研究[J].西安交通大学学报,2005.39(10)1043-1047

猜你喜欢

设计模式面向对象语言
“1+1”作业设计模式的实践探索
三维协同设计模式下的航天项目管理实践与展望
语言是刀
交通机电工程设计模式创新探讨
面向对象的计算机网络设计软件系统的开发
让语言描写摇曳多姿
面向对象的数据交换协议研究与应用
累积动态分析下的同声传译语言压缩
面向对象Web开发编程语言的的评估方法
面向对象信息提取中影像分割参数的选择