1.设计模式概述
1.1设计模式的概念
GoF设计模式:对被用来在特定场景下解决一般设计问题的类和互相通信的对象的描述。通俗地说,可以把设计模式理解为对某一类问题的通用解决方案。
1.2设计模式的组成
一般的,在描述一个设计模式时,至少需要包含四个方面:
- 模式名称(Pattern name)
- 问题(Problem)
- 解决方案(Solution)
- 效果(Consequence)
这四个方面就是设计模式的四要素。
1.3GoF设计模式(模式介绍)
创建型
1.Factory Method模式(工厂方法)
Factory Method
模式提供了一种延迟创建类的方法,使用这个方法可以在运行期由子类决定创建哪一个类的实例。
2.Abstract Factory模式(抽象工厂)
Abstract Factory又称为抽象工厂模式,该模式主要为解决复杂系统中对象创建的问题。抽象工厂模式提供了一个一致的对象创建接口来创建一系列具有相似基类或相似接口的对象。
3.Buider模式(建造器)
Builder模式与Abstract Factory模式非常类似,但Builder模式是逐步地构造出一个复杂对象,并在最后返回对象的实例。Builder模式可以把复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示。
4.Prototype模式(原型)
Prototype模式可以根据原型实例制定创建的对象的种类,并通过深复制这个原型来创建新的对象。Prototype模式有着同Abstract Factory模式和Builder模式相同的效果,不过当需要实例化的类是在运行期才被指定的而且要避免创建一个与产品曾是平行的工厂类层次时,可以使用Prototype模式。使用Prototype模式可以在运行时增加或减少原型,比Abstract Factory和Builder模式更加灵活。
5.Singleton模式(单例)
使用Singleton模式可以保证一个类仅有一个实例,从而可以提供一个单一的全局访问点。
结构型
6.Adapter模式(适配器)
Adapter模式可以解决系统间接口不相容的问题。通过Adapter可以把类的接口转化为客户程序所希望的接口,从而提高复用性。
7.Bridge模式(桥接)
Bridge模式基于类的最小设计的原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保证各部分的独立性以及应对他们的功能拓展。
8.Composite模式(组合)
Composite模式提供了一种以树形结构组合对象的方法,使用Composite可以使单个对象和组合后的对象具有一致性以提高软件的复用性。
9.Decorator模式(装饰者)
Decorator模式可以动态地为对象的某一个方法增加更多的功能。在更多时候,使用Decorator模式可以不必继承出新的子类从而维护简介的类继承结构。
10.Facade模式(门面)
Facade模式为一组类提供了一致的访问接口。使用Facade可以封装内部具有不同接口的类,使其对外提供统一的访问方法。Facade模式在J2EE系统开发中发展为Session Facade模式。
11.Flyweight模式(享元)
Flyweight模式可以共享大量的细粒度对象,从而节省创建对象所需要分配的空间,不过在时间上的开销会变大。
12.Proxy模式(代理)
顾名思义,Proxy模式为对象提供了一种访问代理,通过对象Proxy可以控制客户程序的访问。例如:访问权限的控制、访问地址的控制、访问方式的控制等,甚至可以通过Proxy将开销较大的访问化整为零,提高访问效率。
行为型
13.Interpreter模式(解释器)
定义了一个解释器,来解释遵循给定语言和文法的句子。
14.Template Method模式(模板)
定义一个操作的模板,其中的一些步骤会在子类中实现,以适应不同的情况。
15.Chain of Responsibility模式(责任链)
Chain of Responsibility模式把可以响应请求的对象组织成一条链,并在这条对象链上传递对象,从而保证多个对象都有机会处理请求而且可以避免请求方和响应方的耦合。
16.Command模式(命令)
将请求封装为对象,从而增强请求的能力,如参数化、排队、记录日志等。
17.Iterator模式(迭代器)
Iterator模式提供了顺序访问一个对象集合的各元素的方法,使用Iterator可以避免暴露集合中对象的耦合关系。
18.Mediator模式(中介者)
Mediator模式可以减少系统中对象间的耦合性。Mediator模式使用中介对象封装其他对象,从而使这些被封装的对象间的关系就成了松散耦合。
19.Memento模式(备忘录)
Memento模式提供了一种捕获对象状态的方法,且不会破坏对象的封装,并且可以在对象外部保存对象的状态,并在需要的时候恢复对象状态。
20.Observer模式(观察者)
Observer模式提供了将对象的状态广播到一组观察者的方式,从而可以让每个观察者随时都可以得到对象更新的通知。
21.State模式(状态)
State模式允许一个对象在其内部状态改变的时候改变他的行为。
22.Strategy(策略)
使用Strategy模式可以让对象中算法的变化独立于客户。
23.Visitor模式(访问者)
表示对某对象结构中各元素的操作,使用Visitor模式可以在不改变各元素类的前提下定义作用于这些元素的新操作。具有固定结构的活动节点需要多种处理能力,且处理能力可扩展,也就是说要求在不改变原来类结构(活动节点)的基础上增加新功能。
1.5设计模式与软件架构
1.6设计模式分类
| 创建型 | 结构型 | 行为型 | ||
|---|---|---|---|---|
| 应用范围 | 应用于类 | Factory Method | Adapter |
Interpreter Template Method |
| 应用于对象 |
Abstract Factory Builder Prototype Singleton |
Adapter Bridege Composite Decorator Facade Flyweight Proxy |
Chain of Responsiblity Command Interator Mediator Memento Observer State Strategy Visitor |
|
1.7设计模式的六大原则
开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有的代码,实现一个热拔插的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级,想要达到这样的效果,我们需要使用接口和抽象类。
1.8模式具体分析
5.Signleton模式
7.Bridge模式
桥接模式的角色和职责:
1.Client调用端
这是Bridge模式的调用者。
2.抽象类(Abstraction)
抽象类接口(接口这货抽象类)维护对行为实现(implementation)的引用,他的角色就是桥接类。
3.Refined Abstraction
这是Abstraction的子类。
4.Implementor
行为实现类接口(Abstraction接口定义了基于Implementor接口的更高层次的操作)
5.ConcreteImplmentor
Implementor的子类。
桥接模式的UML图如下:

总结:
1.桥接模式的优点
(1)实现了抽象和实现部分的分离
桥接模式分离了抽象部分和实现部分,从而极大地提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
(2)更好的可扩展性
由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。
(3)可动态的切换实现
由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。
(4)实现细节对客户端透明,可以对用户隐藏实现细节。
2.桥接模式的缺点
(1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
3.桥接模式的使用场景
(1)如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使他们在抽象层建立一个关联关系。
(2)抽象化角色和实现化角色可以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。