第一篇 模式介绍
模式被引入软件开发和OOP语言的流行是分不开的,在20世纪80年代末至90年代初,面向对象软件设计逐渐成熟,被计算机界广泛理解和接受。然而由于专业开发人员和非专业开发人员作出的设计差异巨大,为了让OOP开发人员能够使用OOP设计进行专业开发,经过多年的不懈努力,最终由GoF四人根据当时的一些成熟经验和解决方案归纳出了23条最基本的设计模式,以供OOP开发人员学习和使用。
本篇首先从面向对象谈起,回顾一下面向对象的一些基础概念,讲述OOP开发设计带来的好处,以及为什么要学习和使用设计模式。接着在第2章将为读者讲述第一个最简单也最容易理解的模式——模板方法(Template Method)模式。
第1章 谈面向对象和模式
本章将简单总结一下面向对象领域的概念,读完本章并不能使你成为面向对象的专家,它将为你学习以下各章做准备。
主要包括内容如下:
面向对象的概念和范式。
模式的概念及与面向对象之间的关系。
学习设计模式常见的问题。
当你阅读完全书后,再回来阅读本章,你将会有更多体会,也一定能回答这些设计模式的常见问题了。
1.1 什么是对象
也许你已经使用面向对象做开发好几年了,面向对象的概念也似乎不难理解,但是很多人并未认识面向对象编程的本质,继续偏向于使用PP/FP(Procedural Programming/Functional Programming)方式编程。在讲述模式之前,我们先回顾一下什么是面向对象。
在OOP世界里,任何事物,不管是无形的还是有形的,都是对象。对象是包含一些行为和属性的一种组合体,它反映的是客观世界的任何事物。比如,马有腿、耳朵和嘴巴等属性,它们会跑,也会嘶叫,这些是它们的行为。每个对象都归属于某一特定的类型,比如说,一匹汗血宝马的类型是马。
面向对象的语言一般都有三个基本特征。
1.封装
封装是面向对象最重要的特征之一,封装就是指隐藏。
对象隐藏了数据(例如Java语言的private属性),避免了其他对象可以直接使用对象属性而造成程序之间的过度依赖,也可以阻止其他对象随意修改对象内部数据而引起对象状态的不一致。
对象隐藏了实现细节。
使用者只能使用公有的方法而不能使用那些受保护的或者私有的方法,你可以随意修改这些非公有的方法而不会影响使用者;
可以隐藏具体类型,使用者不必知道对象真正的类型就可以使用它们(依赖于接口和抽象带来的好处);
使用者不需要知道与被使用者有关和使用者无关的那些对象,减少了耦合。
由于只能通过公用接口和方法使用它们,这样,客户程序就不能使用那些受保护的方法(例如Java语言里的private方法和protected方法),而你可以随意修改这些方法,并不会影响使用者,从而降低了耦合度。
2.继承
继承可以使不同类的对象具有相同的行为:为了使用其他类的方法,我们没有必要重新编写这些旧方法,只要这个类(子类)继承包含那些方法的类(父类)即可。
从下往上看,继承可以重用父类的功能;从上往下看,继承可以扩展父类的功能。
3.多态
多态可以使我们以相同的方式处理不同类型的对象:我们可以使用同一段代码处理不同类型的对象,只要它们继承/实现了相同的类型。这样,我们没有必要为每一种类型的对象撰写相同的逻辑,极大地提高了代码重用程度。