1 设计模式概述
1.1 计算机软件的发展现状
21世纪是网络信息技术日益发展的世纪,计算机技术的应用已经是未来发展的必然趋势。自从1971年微处理器问世以来,计算机经历了4位机、8位机和16位机的时代, 20世纪90年代初出现了32位结构的微处理器计算系统,并将进入64位计算时代。自从1991年MIPS公司的64位机R4000问世之后,已陆续有DEC公司的Alpha 21064、21066、21164和21264,HP公司的PA8000IBM,Motorola/Alpha的Power PC 620,Sun的Ultra-SPARC,以及Intel公司的Merced等64位机出现。随着计算机芯片的不断更新换代,也为计算机软件行业带来更多的发展机遇,许多软件应用技术不断被创新。
就国内的计算机软件状况来看,软件行业已经得到蓬勃发展,取得了令人瞩目的成绩,政府部门也是大力扶持本地软件企业,为软件行业的发展提供更多优惠政策,让软件企业获得良好的发展空间。自从计算机软件技术兴起以来,从一两个人的团队发展成为拥有几千人的知名企业在国内并不少见,国内软件行业的兴盛是显而易见的。计算机软件作为一门学科,从其诞生到现在不过短短的半个世纪,随着技术的不断创新,已经慢慢融入我们的日常生活中。如今移动互联网的发展更是为计算机软件行业带来发展的又一次绝佳机遇,在其他很多高科技领域中,也都要依附于计算机软件技术的支撑。因此,计算机软件行业的前景在众多行业中还是比较有优势的,无论现在还是将来。
然而,随着计算机软件的不断发展,更多的资源都在向其靠拢,泡沫也势必会逐渐形成,计算机软件的泛滥也应当引起我们的注意。如何不被社会所淘汰,让自己或者企业处于不败的地位?这就需要掌握独门绝技,打好稳固的根基。
1.2 引入设计模式的必要性
“物以稀为贵”,这是一句至理名言。越是稀有的东西,它的价值就会越高;同样的东西变得多了,其自身价值就会贬值。在计算机软件行业长足发展的今天,越来越多的软件企业出现在我们面前,软件行业的从业人员也变得越来越复杂,有的是计算机专业,也有的是转行过来的。计算机软件技术再也不是那种高深莫测的未知领域,已经开始向大众化普及,各种从业人员的专业素养良莠不齐,计算机软件的质量更是难以得到保证。因此,引入软件设计模式将成为企业或者个人可持续发展的必然选择。只有专业,才能在这个领域做得最好,为社会、企业和个人带来更多的价值。
读本书的人一般是已经从事了一定软件开发工作的人员,设计模式就是当你在实践当中遇到问题但又不知如何解决时想得到的解决方式。一般刚开始涉足软件领域的从业人员,没有设计模式的概念,认为那是一种虚无缥缈、居于庙堂之上的大师讲说内容,与我们毫无关系,这种想法是错误的。设计模式其实就是实际经验的积累和总结,都是着重解决具体的实际问题。更有甚者可能不知道设计模式为何物,这种情况就更需要学习本书内容,让你快速领悟设计模式的魅力。
设计模式是计算机软件领域比较抽象的内容,设计模式带给我们的是:使我们从复杂、烦乱的代码中解脱出来,让软件系统变得更加稳定、更加易于扩展,维护更加轻松。这就是为什么引入设计模式。
1.3 软件设计遵循的基本原则
1.3.1 高内聚、低耦合
一个软件系统要有一个稳定的架构,不会随需求的改变而发生巨大的变动。因此,高内聚、低耦合是一个软件系统设计中必须遵循的基本原则。
所谓高内聚,是指一个软件模块内各个元素彼此结合的紧密程度要高,即一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
所谓低耦合,是指一个软件结构内不同模块之间的互连程度要低。不同模块之间的联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性、调用的方式及传递的信息。
因此,在一个软件系统中,应当尽量保证模块的独立性,模块实现功能职责单一,越简单越好。这样有利于系统复用,并且大大减少模块之间的依赖,系统稳定性高,更易于维护。
1.3.2 面向抽象编程
在面向过程的软件开发中,上层组件调用下层组件,就意味着上层组件依赖于下层组件,当下层组件发生剧烈变化时,上层组件也要跟着一起发生变动,这将导致软件组件模块的复用性大大降低,从而增加软件开发成本,使软件结构设计上存在一定的臃肿性,不利于后期系统维护工作。
在面向对象的软件设计中,很好地解决了上述问题,使程序都依赖于抽象,而不是依赖具体实现。因为在一般情况下抽象的变化概率比较小,依赖抽象编程大大降低了客户应用程序与实现细节的耦合度,提升了软件结构的健壮性。只要保证抽象不发生变化,客户程序就不需要改变。这就是依赖倒置原则,我们将在后面章节讲解。
在程序中要尽量使用抽象类型作为对象实例变量类型,这样就保证了将客户程序与具体实现之间解耦,因为使用的是抽象类型,因此具体实现的改变不会影响抽象类型的改变。
1.3.3 多用组合少用继承
在面向对象的软件设计中,对于类的扩展,首先想到的是使用类的继承来实现,由子类继承父类,从而完成对子类功能的扩展。继承的好处是可以尽量让相同的属性或者功能复用,但是随着项目越来越大,需求的不断变化,继承就会变得越来越臃肿,后期难以控制和维护。最重要的是,继承会不分青红皂白地把父类的公有和受保护的方法统统继承下来,而这些方法可能是子类不需要的功能,会对子类产生一些危害。
如果使用组合方式,就不会出现上述继承的问题。所谓对象组合,是指在一个对象中含有另外一个对象的引用,从而可以使用该内部对象的引用作出一些处理行为。使用组合方式的好处有以下几点:首先,不会对类产生有害的影响;其次,组合方式要比继承方式灵活,因为是由系统运行动态地决定使用对象与否;最后,不会造成因继承而引起的类膨胀,减少了对父类的依赖性。
1.3.4 “开-闭”原则
“开-闭”原则,即“对扩展开放,对修改关闭”,指的是在软件设计中,当对某一软件实体进行扩展时,尽量不要去修改原有的软件实体,换句话说就是在不修改原有软件实体的情况下对其进行扩展。这种软件设计方式其实是一种目标,它考虑了软件后期的维护等其他因素。一个软件系统如果可以达到这个目标,那它就是可扩展、易维护的。
在软件设计领域中,众多设计模式的应用就是为了达到这个目标。“开-闭”原则是一种很抽象的设计原则,更像是一种倡导的口号,其他设计原则都是为了实现“开-闭”原则的具体原则。“开-闭”原则与其他设计原则就好比抽象父类和子类的关系一样。
1.4 设计模式概述
1.4.1 什么是设计模式
设计模式的概念最早是由一名建筑师提出来的,他试图在图纸上用一种结构化、可重用化的方法,获得建筑的基本要素,从而可以将更多的精力放在具体建筑物和城镇的设计上。逐渐的,这种思想在软件领域流行起来,并获得发展。
设计模式(Design Pattern)就是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式的目的是为了提高代码的可重用性,让代码更容易被他人理解,使系统质量更加有保证、系统更加可靠。
1.4.2 为什么需要设计模式
设计模式的应用,无论对个人、企业、还是社会都是有百利而无一害的。
首先,它可以提升个人的编程能力、思维能力和设计能力,极大提高工作效率,让个人获得更大发展空间;
其次,对于企业,应用设计模式可使软件产品质量得到保证,系统稳定性大大提升,为企业创造出更多的利润上升空间;
最后,个人和企业都在不断地发展壮大,自然会创造出更多的社会价值,为社会作出更多的贡献。
因此,我们需要设计模式、企业需要设计模式、社会也需要设计模式。设计模式或将成为改变一个人职场命运、一个企业成败关键、甚至一个社会经济发展的重要因素。
1.4.3 如何正确应用设计模式
实践是需要理论知识积累的。要想正确应用各种设计模式,首先需要学习设计模式,掌握设计模式的实现要点,最重要的是在学习设计模式当中掌握软件设计原则。设计模式是前人的实践经验总结出来的,具有固定的实现方式,但是设计原则是活的,是需要我们认真体会和领悟的。就像一本武功秘笈,并不是什么人得到都能学会绝世武功,而是需要一定的悟性,所谓人心合一,将自己融入其中,才能达到武术的最高境界。设计模式就像一本武功秘笈,要在学习中有所思、有所想、有所悟,才能达到软件设计思想的最高境界。打下了良好的理论根基,在实际的应用中就会得心应手。
1.5 设计模式的分类
设计模式是一种解决问题的思想,它可以应用在任何环境当中,保证系统的稳定运行。
按照范围来分,设计模式可以分为类模式和对象模式。
类模式用来处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来了;对象模式是处理对象间的关系,这些关系在运行时是可以变化的,更具动态性。
按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。
按照目的的分类方式是采用最多的分类方式,本书中正是按照这种分类方式来讲解设计模式的。
1.5.1 创建型模式
创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:
工厂方法模式(Factory Method Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
单例模式(Singleton Pattern)
1.5.2 结构型模式
结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰者模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
1.5.3 行为型模式
行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
策略模式(Strategy Pattern)
模板方法模式(Template Method Pattern)
访问者模式(Visitor Pattern)
1.6 学会归纳和总结
设计模式是前人实践经验的总结,是经过千锤百炼的思想结晶。我们学习设计模式不是真正的目的,我们真正的目的是学习这种思想,并在实践当中具体应用,并且学会归纳和总结,让我们的思维活跃起来,不再拘泥于计算机编码,而是上升到一定的理论空间。让理论指导实践,实践充实理论,这样就会形成一种良性循环,不断提升自己的理论、实践能力,从而实现个人最大的社会价值。
经验是很宝贵的财富,在实践经验中,我们可以获得很多宝贵的思想,当你的思想积累到了一定程度的时候,你就会有所领悟,有所想法,从而慢慢地形成一套理论,并付诸实践当中,不断地改进并吸取经验,到那时,相信会出现一种全新的设计模式,而这正是出于你的思想!