【设计模式】概述(上)

【设计模式】概述(上)


一、总述

1.背景

    设计模式的思想最早不是出现在软件领域,而是在建筑领域。这个术语在1990年代由艾瑞克·伽马(Erich Gamma)等人引入计算机领域,并在之后几年合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,业内也将四位作者合称为GoF四人组(Gang of Four)。

    至今为止,狭义的设计模式还是指该书中整理收录的23种经典设计模式

2.概念

    设计模式的全称是“软件设计模式(Software Design Pattern)”,简单来说,设计模式是前辈们总结的代码开发经验,用于解决一些特定场景下的现实问题,最后整理出的一系列通用套路。

    如果对这方面有所涉猎,我们常见到的定义如下:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

3.目的、作用、意义

​ (1)通过运用设计模式,可提高代码的可重用性、灵活性和健壮(安全)性
​ (2)通过学习设计模式,有助于开发人员理解面向对象的编程方式(即类、对象之间的关系设计),并提高程序员的编程能力、思维能力、设计能力
​ (3)设计模式的出现与软件行业日益工程化的现状相呼应,运用了设计模式的项目将更加编制化、工程化,大大提高开发效率,并且代码也更加灵活和易于扩展

4.基本要素

    模式名称(Pattern Name):每一个模式都有自己的名称,由一两个词组成,根据模式的问题、特点、解决方案和效果等来命名。模式名称使得我们能够方便地对其进行讨论。

    问题(Problem):描述了该模式适用于什么场景,用来解决什么特定问题。这些场景(或类似场景)一般都具有典型性,在生产生活中会反复遇到。前辈们在总结了历次的解决方法后,形成了对应的通用套路,即设计模式。

    解决方案(Solution):包括模式设计的组成成分,以及各成分的职责和它们之间的协作关系。

    效果(Consequence):描述了模式的应用效果,即模式的优缺点/特点。主要从空间、时间两个维度考量,评估其对系统灵活性、扩展性、可移植性的影响,而影响包括好坏两个方面。

    需要注意,设计模式是一种编程思想,可应用到各种面向对象的编程语言中,如C++/Java/Python等,并非某一种语言独有。


二、设计模式分类

    设计模式的分类有两种方式,一种根据作用范围来划分,可分为类模式和对象模式;另一种根据目的来划分,可分为创建型模式、结构型模式、行为型模式。通常我们讨论后者,即按目的划分。

1.创建型模式

    创建型模式主要关注“怎样创建对象”,特点是“将对象的创建和使用分离”。这类模式通常在内部封装好了对象的创建和组装过程,使得对象的使用者不必关心创建细节,只要专注于实现对象的行为即可。

    创建型模式包括:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式等。

    例如我们平时使用的共享单车,以路人身份来看,我们不关心它是怎么生产制作出来的,又是怎么在城市里投放运营的,只知道摆在我们面前有一辆扫码后可骑行的现成自行车即可。

2.结构型模式

    结构型模式描述了如何将类和对象按某些方式组织成更大更复杂的结构。结构型模式中全部都是对象结构模式,其中适配器模式还可以采用类结构模式来实现。

    类结构模式通过继承机制来组织接口和类,而对象结构模式采用组合或聚合的方式来组织对象。由于组合/聚合关系比继承关系的耦合度更低,也符合“合成复用原则”,所以在实际开发中更推荐这种方式。

    结构型模式包括:代理模式、适配器模式、装饰模式、外观模式、桥接模式、享元模式、组合模式等。

    现实生活中我们也能找到这类模式的应用场合,比如房产中介问题可以用代理模式来解决。户主将房屋资料递交给中介方,委托中介进行房屋的出租或买卖,对于租用/购买方来说,第一交互对象是中介(代理层)而不是原户主。

3.行为型模式

    行为型模式设计了系统运行时的复杂流程控制,分配算法和对象之间的关系,主要体现各对象之间的交互协作。行为型模式中大部分都是对象结构型模式,只有模板方式模式和解释器模式是类结构模式(通过继承来实现)。

    行为型模式包括:模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、迭代器模式、备忘录模式、中介者模式、访问者模式、解释器模式等。

    在现实生活中,如各应用的版本快照、数据库备份、游戏存档等,就可以用备忘录模式来实现。而职场中的请假申请、各流程审批等就可以用职责链模式来实现(但更推荐当下流行的工作流来实现)。


    最后,在实际开发中,往往不会单独使用某一模式,而是各种模式 、算法结合起来使用。而且也不是原样不动地套用原模式,而是结合具体业务进行一定的调整和变体,最终目的是为了提高系统代码的灵活性、健壮性和可扩展性等,不仅能提高开发效率,也能提高维护效率。

    设计模式通常运用在两个节点,一个是项目初期的框架设计阶段,另一个是中后期的代码重构阶段


参考文章:百度百科;C语言中文网(http://c.biancheng.net/);博客园、CSDN中的相关文章

你可能感兴趣的:(设计模式,java,设计模式)