【系统架构设计】设计模式
- 设计模式概述
-
- GoF设计模式
-
- [Factory Method](#Factory Method)
- [Abstract Factory (*)](#Abstract Factory (*))
- Builder
- Prototype(原型)
- Singleton(*)
- Adapter
- Bridge
- Composite(组合)
- Decorator(装饰)(*)
- Facade(外观)(*)
- Flyweight(享元)
- Proxy
- Interpreter(解释器)
- [Template Method](#Template Method)
- [Chain of Responsibility](#Chain of Responsibility)
- Command
- Iterator
- Mediator(中介模式)(*)
- Memento(备忘录模式)
- Observer(观察者)(*)
- State
- Strategy
- Visitor
- GoF模式分类
- 其他设计模式
设计模式概述
- 设计模式解决是一类问题
- 设计模式是一种通用的解决方案,而不是具体的,也不是唯一的
- 设计模式的使用要适度,过度使用会让架构变得混乱而难以维护
- 描述一个设计模式时,至少需要包含四个方面:模式名称、问题、解决方案、效果
ps: 架构的话就是整体系统的布局,而设计模式就是里面具体问题的一种解决思想。
GoF设计模式
Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人组在书《设计模式:可复用面向对象软件的基础》中提出的设计模式,统称为GoF设计模型,一共提出了23个模式。
Factory Method
提供了一种延迟创建类的方法,使用这个方法可以在运行期由子类决定创建哪一个类的实例
Abstract Factory (*)
又称为抽象工厂模式,该模式主要为解决复杂系统中对象创建的问题。抽象工厂模式提供了一个一致的对象创建接口来创建一系列具有相似基类或相似接口的对象。本质上就是咱们平时用的创建多个抽象类,然后根据不同对象情况进行实现。
Builder
与 Abstract Factory 模式非常类似,但 Builder 模式是逐步地构造出一个复杂对象,并在最后返回对象的实例。Builder 模式可以把复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示。
Prototype(原型)
可以根据原型实例制定创建的对象的种类,并通过深复制这个原型来创建新的对象。Prototype 模式有着同 Abstract Factory 模式和 Builder 模式相同的效果,不过当需要实例化的类是在运行期才被指定的,而且要避免创建一个与产品
曾是平行的工厂类层次时,可以使用 Prototype 模式。使用 Prototype 模式可以在运行时增加或减少原型,比 Abstract Factory 和 Builder 模式更加灵活
Singleton(*)
也是一种很有代表性的模式。使用 Singleton 模式可以保证一个类仅有一个实例,从而可以提供一个单一的全局访问点。其实就是单实例,只有一个实例对象,不能创建多个,C++ 中可以用Template ,比如打印操作,那肯定就是单实例,不能多实例操作。
Adapter
可以解决系统间接口不相容的问题。通过 Adapter 可以把类的接口转化为客户程序所希望的接口,从而提高复用性。
Bridge
把类的抽象部分同实现部分相分离,这样类的抽象和实现都可以独立地变化。
Composite(组合)
提供了一种以树形结构组合对象的方法,使用Composite 可以使单个对象和组合后的对象具有一致性以提高软件的复用性。
Decorator(装饰)(*)
可以动态地为对象的某一个方法增加更多的功能。在很多时候,使用 Decorator 模式可以不必继承出新的子类从而维护简洁的类继承结构。本质上就是多继承,新增加一个与接口相同的装饰类,然后对这个装饰类去进行不断继承与具体实现。
Facade(外观)(*)
为一组类提供了一致的访问接口。使用 Facade 可以封装内部具有不同接口的类,使其对外提供统一的访问方式。Facade 模式在 J2EE 系统开发中发展为 Session Facade 模式。本质上就是封装具体实现,然后对外开放一个的公共接口让其余系统访问,这样避免调用方去理解具体实现,只需要调用同一个接口,然后就可以调用不同的业务方法。
Flyweight(享元)
可以共享大量的细粒度对象,从而节省创建对象所需要分配的空间,不过在时间上的开销会变大。
Proxy
为对象提供了一种访问代理,通过对象 Proxy 可以控制客户程序的访问。最近博文中碰到的hook 就用到了这个代理模式。
Interpreter(解释器)
定义了一个解释器,来解释遵循给定语言和文法的句子。
Template Method
定义一个操作的模板,其中的一些步骤会在子类中实现,以适应不同的情况。
Chain of Responsibility
把可以响应请求的对象组织成一条链,并在这条对象链上传递请求,从而保证多个对象都有机会处理请求而且可以避免请求方和相应方的耦合。最近方案设计中就用到了这种,一请求可以有多对象回复,然后选其中一个回复。
Command
将请求封装为对象,从而增强请求的能力,如参数化、排队、记录日志等。
Iterator
提供了顺序访问一个对象集合中的各元素的方法,使用 Iterator 可以避免暴露集合中对象的耦合关系。
Mediator(中介模式)(*)
可以减少系统中对象间的耦合性。Mediator 模式使用中介对象封装其他的对象,从而使这些被封装的对象间的关系就成了松散耦合。有点类似消息机制,但又与消息机制有很大区别,不需要负责消息的排队、优先级等处理。
Memento(备忘录模式)
提供了一种捕获对象状态的方法,且不会破坏对象的封装。并且可以在对象外部保存对象的状态,并在需要的时候恢复对象状态。
Observer(观察者)(*)
提供了将对象的状态广播到一组观察者的方式,从而可以让每个观察者随时可以得到对象更新的通知。像之前用的MQTT 就是,订阅发布的体现。
State
允许一个对象在其内部状态改变的时候改变它的行为。
Strategy
可以让对象中算法的变化独立于客户。
Visitor
表示对某对象结构中各元素的操作,使用 Visitor 模式可以在不改变各元素类的前提下定义作用于这些元素的新操作。
GoF模式分类
根据设计模式要解决的问题将设计模式分为三类:创建型、结构型、行为型。
其他设计模式
在GoF后,人们继续对设计模式进行挖掘,在J2EE应用领域,人们也对J2EE框架开发的应用程序总结了一些设计模型。这边主要介绍 Intercepting Filter 模式(筛选器模式),这种就是咱们平时在Servlet通信前加的过滤器Filter,里面可以预处理,如验证客户身份、验证请求来源等,很常用。