讲讲设计模式

设计模式一直是从事编程相关人员的基本考核指标,不论是在日常业务开发中还是在求职面试中,设计模式相关知识均占据相当重要的地位。不仅如此,在我们学习重要框架源码时,学习好设计模式也能让我们对框架架构有个深入的理解。笔者在日常业务开发面对复杂业务场景下,经常不知如何下手,如何组织以及评估代码的质量等一系列问题。因此通过此专栏重新深入地理解设计模式,增加对设计模式中涉及的代码思想的理解。
本文可能会解决你的哪些困惑点:

  1. 对设计模式不太了解?是Java语言才有的吗?其他非OO编程语言是否也有设计模式呢?
  2. 在日常开发中感觉并用不到学习的设计模式,所以是不是不应该学习?或者说学习设计模式能给我们带来什么?
  3. 其他资料有提到"过度设计"、“设计模式增加代码复杂度”、"错误使用设计模式"等一些列由设计模式带来了很多问题,如何把握设计模式在业务代码中的使用?或者说什么情况下使用设计模式呢?如何评价设计模式的使用质量?
  4. 设计模式示例简单易理解,可面临复杂业务场景时,学习的设计模式似乎毫无用途?

针对以上问题,下文均会逐步给出答案。文章组织结构上,首先讲述下设计模式的起源以及本质要解决的问题,然后概述目前已有设计模式种类,之后讲下整体学习设计模式的学习方法、以及后续如何应用到具体业务中。

一、何为设计模式

1.1 建筑学设计模式

设计模式(Design Pattern)最早来源于建筑领域。克里斯托弗·亚历山大(Christopher Alexander)是20世纪最具有影响力的建筑及系统理论家。其于1977年出版的《建筑模式语言》(A Pattern Language)一书中描述了253种建筑的基本模式,亚历山大将他的模式描述为“一条通向更人性化建筑的平庸而合乎逻辑的道路”。这些模式基于基础需求而非功能化的建筑设计信仰,每个设计模式描述了一个问题,然后 提出一个解决方案。好的建筑设计,其物理空间和社会空间必定是一致的。下面列举了一些模式一起感受下:
模式示例1:夫妻住宅
问题描述:“他们作为父母而不是夫妻的角色,渗透到私人关系的方方面面。”
解决之道:“创造一个私密的夫妻王国……一个允许成年男女亲密以对、能与对方分享欢乐和悲伤的世界。”

模式示例2:共宿
问题描述:“许多传统文化中,睡觉是公共性的活动,而不仅仅是与性有关。一家人在一起睡觉具有重要的社会功能,就像共同进餐那样,是人的基本需要。”
解决方案:“布置一个可能让孩子和成年人睡在同一空间的地方,彼此能看见、听见。作为调剂,让日常的睡觉习惯偶尔变化。共宿的地点可以安排在壁炉附近,在凹室放个大垫子和一些毯子,也可以让客人在这儿过夜。”
示范的案例将复杂的设计任务追溯到特定的主题上,这种设计方式也可移植到编程模式之上,即形成了编程设计模式。

1.2 编程设计模式

1995年GOF(Gang of Four,四人组)收集并整理了23种设计模式,从此树立了软件设计模式领域的里程碑,人称【GoF设计模式】。这23种设计模式的本质是对面向对象设计原则的实际应用,对类的封装性、继承性、多态性、以及类的关联组合关系的充分理解的体现。
编程设计模式,是软件设计中常见问题的典型解决方案。和建筑设计模式类似,每个模式也都是针对代码中的特征问题提出解决蓝图方案。好的解决方案,代码的可读性、稳健性、维护性等均有考虑到。
因此,设计模式的本质上实际是对常见问题的典型解决方案,虽然编程设计模式的提出迅速在JAVA等一系列OO类型语言体系中被广泛使用,但是其他类型,如动态语言,也可以应用到其他设计模式。在另外一方面,虽然目前典型的设计模式是23种,但是在日常开发中,遇到的场景个各种各样,我们需要具备创造一个质量高的新设计模式的能力。何为好的设计模式?针对于此,设计模式也提出了一系列的设计原则

二、典型设计模式概述

2.1 设计模式

GoF总结的23种设计模式大致可分为三种类型:

  • 创建型【六种】
    这一类设计模式解决了创建对象产生的不同问题,包括单例模式、工厂模式、抽象工厂模式,原型模式、建造者模式。
  • 结构型【七种】
    这一类设计模式解决了类之间的组合(继承、多态、组合)关系产生的不同问题,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式。
  • 行为型【十一种】
    这一类设计模式解决了对象交互产生的不同问题,包括职责链模式、命令模式、解释器模式、迭代者模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式。

2.2 设计原则

前面提到,虽然经典设计模式仅有23种,但是随着编程语言的发展以及业务的复杂性,我们可以在其他复杂的场景下总结一些很好的解决方案作为新的设计模式。然而,如何创造一个质量高的设计模式,如何评价一个设计模式的优劣等这些问题是要遵循一系列设计原则的,这些设计原则包括:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则、里氏替换原则。

我们对以上设计模式以及设计原则的学习,能够帮助我们在特定复杂业务场景中,迅速找到解决方案,并且拥有对代码组织方式质量高低的评价能力。 学习了这些设计模式并不意味着就能够应付我们在实际业务中遇到的所有问题,前面提到设计模式仅对是针对特殊问题提出的经典解决方案,因此我们学习设计模式必须具备这样一种能力,在面临更加复杂的业务场景时,我们通过一定的设计模式基础储备能够拥有创造更好的设计模式的能力

三、如何学习好设计模式?

“如何学习好设计模式?”这个问题很重要,我们必须从其本质出发,真正的认识到这是什么东西,我们能从中获取到什么?是其本身还是其产生的源头。
设计模式是针对前辈们针对特殊场景下特出的典型解决方案。这些典型解决方案有的可能被我们所使用,有的可能因为代码复杂性不常使用,甚至有的已经在语言层面解决了类似的问题而不再适用。如在面对获取共享全局数据的对象时,我们就会使用“单例模式”来保证全局唯一对象,这个解决方案解决了这个场景下可能存在的多线程等问题。因此,我们在学习设计模式时,需要先分析其要解决的场景以及该场景所带来的问题
更深入的思考,我们需要回答为什么在这种场景下该设计模式就是正确的解决方案。如何通过设计原则以及代码其他方面,如代码可维护性、可读性等分析设计模式的优劣以及评价指标更加重要
学习设计模式需要具备举一反三的能力,学习完一个设计模式,可以尝试性思考下是否存在其他类似的场景?是否存在其他可能的问题?是否存在其他的解决方案?是否能够应用于其他场景中?是否可以与其他设计模式组合?
最后,最好的设计模式还是在解决具体业务问题时才更显的重要。纸上得来终觉浅,将学习到的设计模式应用到实际中,然后面对更加复杂的场景时,创造性的提出更好的解决问题的方案才是学习设计模式最终目标。设计模式需具体实践应用,更重要的是其来源于实际应用。

作者注:后续会不定期更新有关设计模式相关文章,欢迎看到此文章的大佬批评指点~~

【参考】

  • https://www.cnblogs.com/haore147/p/7182519.html

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