3W2H 学习设计模式
一、WHAT 什么是设计模式
设计模式(Design Pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。
二、WHY 为什么使用设计模式
1、设计模式目的
设计模式是为了解决程序开发中,具有更好的:
1).复用性;
2).可读性
3).可扩展性
4).可靠性
5).高内聚、低耦合
2、设计模式的七大原则
设计模式原则,是让程序员在编写程序遵循一定的规则;设计模式常用的原则有以下七大原则:
1).职责单一原则
2).接口隔离原则
3).依赖倒置原则
4).里氏代换原则
5).开闭原则
6).迪米特法则
7).合成复用原则
三、WHEN 什么时候使用设计模式
1、创建型模式
创建型模式提供了一种在创建对象的同时隐藏创建逻辑的方式,不是使用 new直接实例化对象,将软件编程中对象的创建和对象的使用分离。对于这些对象只需要知道它们的接口,而不需要关注具体怎么实现细节,使整个系统的设计更加符合单一职责原则。
创建型设计模式主要包括一下五个模式:
- 单例模式(Singleton Pattern): 保证一个类仅有一个对象,并提供一个访问该类的全局访问入口。
- 工厂模式(Factory Pattern) : 预先定义一个接口,让子类决定实例化哪一个类,工厂模式让一个类的实例化延迟到子类中。
- 抽象工厂模式(Abstract Factory Pattern) : 提供一个创建一系列相关或相互依赖对象的接口。而无需指定具体类。
- 建造者模式(Builder Pattern) : 将一个复杂的对象构建与它的表示分离,使同样的构建过程可以创建不同的表示。
- 原型模式(Prototype Pattern): 指定创建对象的种类,并通过拷贝原型来创建新的对象。
2、结构型模式
结构型设计模式主要是用于处理类(对象)的组合。它描述如何使类(对象)更好组合一起,在程序结构上来解决模块之间的耦合。
结构型设计模式主要包括以下七个设计模式:
- 适配器模式(Adapter Pattern):将一个类的接口转换成另一个接口适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使其可以独立地工作。
- 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责。就扩展功能而言,装饰模式比生成子类的方式更为灵活。
- 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户对单个对象和复合对象的使用具有一致性。
- 外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的接口。外观模式定义了一个顶层接口,这个接口使得子类系统更加容易使用。
- 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。
- 代理模式(Proxy Pattern):为其他对象提供一个代理以控制对这个对象的访问。
3、行为型模式 :
行为型模式大致为分行为型类模式和行为设型对象模式。行为型类模式使用继承描述算法和控制流,而行为型对象模式则描述一组对象怎样协作完成单个对象无法完成的任务。
- 模版方法模式(Template Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 命令模式(Command Pattern):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可取消的操作。
- 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
- 观察者模式(Observer Pattern):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
- 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保持该状态,这样以后就可以将该对象恢复到保存的状态。
- 解释器模式(Interpreter Pattern):定义一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
- 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
- 策略模式(Strategy Pattern):定义一系列的算法,把它们一个个封装起来,并且使他们可相互替换。本模式使得算法的变化可以独立于使用它的客户。
- 责任链模式(Chain of Responsibility Pattern):为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它。
- 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类别的前提下定义作用于这些元素的新操作。
四、HOW 如何使用设计模式
设计模式并非万能,它服务于需求。技术永远为业务服务,技术只是满足业务需要的一个工具。我们需要掌握每种设计模式的应用场景、特征、优缺点,以及每种设计模式的关联关系,这样就能够很好地满足日常业务的需要。使用设计模式为了能好的让程序低耦合,高复用,高内聚,易扩展,易维护。使用设计模式遵循以下几点:
不仅仅是功能性需求,需求驱动还包括性能和运行时的需求,如软件的可维护性和可复用性等方面。设计模式是针对软件设计的,而软件设计是针对需求的,一定不要为了使用设计模式而使用设计模式,否则可能会使设计变得复杂,使软件难以调试和维护。
对现有的应用实例进行分析是一个很好的学习途径,应当注意学习已有的项目,而不仅是学习设计模式如何实现,更重要的是注意在什么场合使用设计模式。
设计模式大部分都是针对面向对象的软件设计,因此在理论上适合任何面向对象的语言,但随着技术的发展和编程环境的改善,设计模式的实现方式会有很大的差别。在一些平台下,某些设计模式是自然实现的。
软件开发是一项实践工作,最直接的方法就是编程。没有从来不下棋却熟悉定式的围棋高手,也没有不会编程就能成为架构设计师的先例。掌握设计模式是水到渠成的事情,除了理论只是和实践积累,可能会“渐悟”或者“顿悟”。
设计模式解决的是设计不足的问题,但同时也要避免设计过度。一定要牢记简洁原则,要知道设计模式是为了使设计简单,而不是更复杂。如果引入设计模式使得设计变得复杂,只能说我们把简单问题复杂化了,问题本身不需要设计模式。
五、HOW TO CHANGE(设计模式如何改变项目开发)
设计模式是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将避免做一些重复性的工作,并且可以设计出高质量的软件系统。设计模式从以下几点改变软件工程中的开发:
1、设计模式是标准的解决方案
设计模式融合了众多专家的经验,并以一种标准的形式供广大开发人员所用,它提供了一套通过的设计词汇和一种通用的语言以方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。对于使用不同编程语言的开发和设计人员可以通过设计模式来交流系统设计方案,每一个模式都对应一个标准的解决方案,设计模式可以降低开发人员理解系统的复杂度。
2、设计模式是可复用的技术方案
设计模式使人们可以更加简单、方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使新系统开发者更容易理解其设计思路。设计模式使得重用成功的设计更加容易,并避免那些导致不可重用的设计方案。
3、设计模式是解决复杂场景的利器
设计模式使得设计方案更加灵活,且易于修改。在很多设计模式中广泛使用了开闭原则、依赖倒转原则、迪米特法则等面向对象设计原则,使得系统具有较好的可维护性,真正实现可维护性的复用。在软件开发中合理地使用设计模式可以使系统中的一些组成部分在其他系统中得以重用,而且在此基础上进行二次开发很方便。
4、设计模式是开发中的基石
设计模式的使用将提高软件系统的开发效率和软件质量,并且在一定程度上节约设计成本。设计模式是一些通过多次实践得以证明的行之有效的解决方案,这些解决方案通常是针对某一类问题最佳的设计方案,因此可以帮助设计人员构造优秀的软件系统,并可以直接重用这些设计经验,节省系统设计成本。