1.外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
什么时候用外观模式呢?
这要分阶段来说,首先在设计初期阶段,应该有意识的将两个不同的层分离,这样就可以为复杂的子系统提供一个简单的接口,使得耦合度大大降低。其次在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数模式使用时也会产生很多很小的类,这本来是好事,但是给外部调用他们的用户程序带来使用上的困难,增加外观模式可以提供一个简单的接口,减少他们的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但是新的需求开发必须依赖他的一些比较重要的功能,此时可以为新系统设计一个外观类,给高复杂度的遗留代码提供一个比较清晰的接口,让新系统与外观对象进行交互。
2.建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。
建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
3.观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态变化时,会通知所有观察者对象,让他们能够自动更新自己。
当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变时,应该考虑使用观察者模式。观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目依赖它的Observer,一旦Subject的状态发生改变,所有的Observer都可以得到通知。Subject发出通知时,并不需要知道谁是他的观察者,任何一个具体的观察者也不需要知道其他观察者的存在。
4代理模式:为其他对象提供一种代理以控制对这个对象的访问。
5.工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟要其子类。
与简单工厂模式的区别:
简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择去动态的实现实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
6.抽象工厂模式:提供一个创建一系列相关或者依赖对象的接口,而无需指定他们具体的。
抽象工程最大的好处是便于交换产品系列,由于具体工厂类在一个应用中只需要初始化时出现一次,这就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂就可以使用不同的产品配置。
7.状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。说白了,就是为了消除庞大的条件分支语句。
8.适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
9.原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
10.模板方法模式:定义一个操作数中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构重新定义该算法的特定步骤。
11.策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换。此模式让算法的变化,不会影响到使用算法的用户。
从概念上来讲,所有这些算法完成的都是相同的工作,只是实现不同。它可以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
12.装饰者模式:动态的给一个对象添加一些额外的职责,就增加功能来讲,装饰者比生成子类更灵活。
13.单例模式:使一个应用程序中只包含一个实例对象。
14.备忘录模式:在不破坏封装性的前提下,获取一个对象内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。
Originator(发起人):负责创建一个备忘录,用以记录当前时刻他的内部状态,并可使用备忘录恢复内部状态。发起人可根据需要决定备忘录存储发起人的哪些内部状态。
Memento(备忘录):负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录。
Caretaker(管理者):负责保存好备忘录,不能对备忘录的内容进行操作和检查。
15.组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
当发现需求中体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑组合模式了。
16.迭代器模式:提供一种方法顺序的访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑迭代器模式。
17.桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立的变化。我的理解是实现系统的多角度分类,每一种类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合。
比如将手机的设计分为手机品牌类和手机软件类,让他们独立的变化,然后桥接起来。
18.命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化。对请求排队或者记录请求日志,以及支持可撤销的操作。
第一.它能比较容易的设计一个命令队列
第二.在需要的情况下,可以比较容易的将命令记入日志
第三.允许接收请求的一方决定是否要否决请求
第四.可以容易的实现对请求的撤销与重做
第五.由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易
19.职责连模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。
这其中的关键是当客户提出一个请求时,请求是沿链传递直至有一个对象负责处理它。
这样做的好处是请求者不管哪个对象来处理,反正该请求有人处理。由于在客户端定义链的结构,所以可以随时增加或者请求的结构。增强了给对象指派职责的灵活性。
20.中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
好处是减少了各个对象之间的耦合,使得可以独立的更改和复用各个对象。
坏处就是交互的复杂性变成了中介者的复杂性,这就使中介者比任何一个对象都复杂。