李 莉 杨 名
(武汉工商学院,湖北 武汉 430065)
《软件设计模式》是一门具有较强理论性和实践性的软件设计和开发类课程。既有理论又有实践,教学难度比较都比较大。如果能从生活中的场景进行比拟和解说,无疑能更好地帮助学生加速理解,加深印象,起到事半功倍的效果。
程序本身就是对生活场景的虚拟和抽象,每一种模式我都能在生活中找到它的影子。比如,说到状态模式,我能想到水有固、液、气三种状态,而人也有少、壮、老三个阶段;提起中介模式,我能立刻想到房产中介;看到装饰模式,我能联想到人的穿衣搭配……
本课程结合日常生活中的案例来诠释各种设计模式,以生活中的小故事开始,用风趣的方式,由浅入深地讲述每一种模式,使教学成为有趣的探讨,可以改进专业课程的教学效果。
水是世界上最奇特的物质之一,不仅滋润万物,更是变化万千!你很难想象冰、水、水蒸气其实是同一个东西H2O,看到冰你可能会联想到玻璃,看到水你可能会联想到牛奶,看到水蒸气你可能会联想到空气。那么如何用程序来模拟水的三种不同状态及相互转化呢?
我们从对象的角度来考虑会有哪个类,首先不管它是什么状态,对象始终是水(H2O),所以会有一个Water类;而它又有三种状态,我们可以定义三个状态类:SolidState、LiquidState、GaseousState;从SolidState、LiquidState、GaseousState这三个单词中我们会发现都有一个State后缀,于是我们会想它们之间是否有一些共性,能否提取出一个更抽象的类,这个类就是状态类(State)。这些类之间的关系可用图表示,如图1所示。
图1 水的三态相关类之间的关系
2.2.2 引出状态模式设计思想
从示例中我们知道,水的三种不同的状态有着完全不一样的外在特性:冰,质坚硬,无流动性,表面光滑;水,具有流动性;水蒸气,质轻,肉眼看不见,却存在于空气中。这三种状态的特性是不是相差巨大?简直就不像是同一种东西,但事实却是不管它在什么状态,其内部组成都是一样的,都是水分子(H2O)。
状态模式的核心思想就是一个事物(对象)有多种状态,在不同的状态下所表现出来的行为和属性不一样。
2.2.3 状态模式的应用场景
1)一个对象的行为取决于它的状态,并且它在运行时可能经常改变它的状态,从而改变它的行为。
2)一个操作中含有庞大的多分支的条件语句,这些分支依赖于该对象的状态,且每一个分支的业务逻辑都非常复杂时,我们可以使用状态模式来拆分不同的分支逻辑,使程序有更好的可读性和可维 护性。
作为新时代的青年,杨再兴之光耀及的后人,我想我是有责任的,有责任去吸引社会对小商桥的关注,让更多人望见渐行渐远的英烈之光;有责任引导人们挣脱名缰利锁,将目光投向小商桥的历史精神和文化。虽然力量很弱小,但至少我可以通过一篇文章,让小商桥的历史更明朗,让小商桥的文明之光照亮传统文化的复兴之路。
2.2.1 生活中的迭代模式
以医院看牙为例,挂号时能看到自己是几号,再到对应科室排队,叫号机上会根据序号依次叫号,每一个诊室的医生诊断完一个病人之后,会呼叫下一位病人,这时外面的显示屏和语音系统自动播报下一位病人的名字。
2.2.2 引出迭代模式设计思想
医院的排号系统就像病人队伍的大管家,通过数字化的方式精确地维护着先来先就诊的秩序。医生不用在乎外面有多少人在等待,更不需要了解每一个人的名字和具体信息。他只要在诊断完一个病人后按一下按钮,排号系统就会自动为他呼叫下一位病人,这样医生就可专注于病情的诊断!这个排号系统就如同程序设计中的迭代模式 。
提供一种方法顺序地访问一组聚合对象(一个容器)中的各个元素,而又不需要暴露该对象的内部细节。
2.3.1 生活中的中介模式
不得不说,租房子是一件烦心而累人的事情!首先,要清楚自己要怎样的房子;然后,要去网上查找房源信息;之后,还要电话咨询,过滤虚假信息和过时信息;接着,还要实地考察,这一步你可能会从东城穿越到西城;最后,还要与各种脾性的房东周旋,讨价 还价。
如果找一家正规点的中介公司,告诉中介对房子的具体要求,中介就会筛选出符合你要求的房源,帮你快速租到适合的房子
2.3.2 引出中介模式设计思想
在上面的生活场景中,因为找房子的过程实在太烦琐了,而且对房源信息也不了解。通过中介,省去了很多麻烦的细节,合同也是直接跟中介签的,甚至都不知道房东是谁!
不需要与房东进行直接交涉,只需要与中介进行交涉即可,一切都可通过中介完成。这使得他找房子的过程,由如图2所示的状态变成了如图3所示的状态,这无疑为他减少了不少麻烦。
图2 没有中介的找房过程
图3 有中介的找房过程
2.3.3 中介模式应用场景
1)一组对象以定义良好但复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
2)一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
3)想通过一个中间类来封装多个类中的行为,同时又不想生成太多的子类。
本文列举了三种设计模式进行了阐述,其他的设计模式也可以在生活化的案例进行类比。
努力发掘日常生活中能够映射到设计模式的场景,可以提高学习《软件设计模式》课程学习的兴趣,使学习者受益,力图追求教学生动有趣,探索出教师快乐教学,学生快乐学习的教学状态。