迭代器模式
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标。这是一种对象行为模式 最大好处就是可以统一对待具有迭代风格的集合
中介者模式
用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,是一种对象行为模式
中介者模式将一个网状的系统结构变成一个以中介者对象为中心的星形结构,在这个星形结构中,使用中介者对象与其他对象的一对多关系来取代原有对象之间的多对多的关系。中介者模式在事件驱动类软件中应用较为广泛,特别是基于GUI 的应用软件。此外,在类与类之间存在错综复杂的关联关系的系统中,中介者模式都可以使用
有以下优点:
- 简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来的多对多交互,一对多更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星形结构
- 可将各同事对象解耦。中介者有利于同事之间的松耦合,可以独立地改变和利用每一个同事和中介者,增加新的中介者和新的同事类者比较方便,更好地符合开闭原则。
- 可以减少大量同事子类生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需要生成新的中介者子类即可,这使得各个同事类可以被复用,无须对同事类进行扩展
备忘录模式
在不在封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。这是一种对象行为型模式
观察者模式
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
状态模式
允许一个在其内部状态改变时改变它的行为,对象看起来修改了它的类。其别名为状态对象,状态模式是一种对象行为模式
简单工厂模式
集中式的创建对象,将对象的创建集中到工厂类中。这样就会有个问题,即,此工厂类的职责太重
工厂方法模式
对象的创建,使用多态/反射等高级技术,客户端统一处理对象的基类,实际处理的类由配置文件决定
抽象工厂方法
工厂使用基类&&子类,创建的结果类也是同样的方法。即系统中包含被创建类的继承关系,也包含工厂类的继承关系。有两个概念:
- 产品等级结构。即产品的继承结构,如一个抽象类是电视机,其子类可以有海尔电视机、TCL电视机
- 产品族。指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如TCL生产的TCL电视机、TCL电冰箱
一个族包含很多不同的产品;一个等级结构包含不同的品牌,产品是相同的
原型模式
主要是对象的复制,特别注意的是深克隆与浅克隆:
基本类型的复制,可以认为都是深复制;引用类型的复制,基本就是浅复制;在做原型模式时,需要注意是否需要深复制。对于深复制,
建造者模式
核心在于如何一步一步地构建一个包含多个组成部件的完整对象,使用相同的构建过程构建不同的产品。与模版模式的区别是:此模式构建过程由客户端控制,可任意顺序创建;而模版模式,创建过程是一定的,由模版抽象类控制,出来的结果是每一步的具体做法不同
适配器模式
协调不同类库中方法的一种模式。适配器包含适配者的引用,客户端调用适配器时,适配器实际去调用适配者的对应方法。这样有个好处就是可以把接口参数不同的方法使用起来。实际中用到的貌似不少,但是用的比较简单不像书中写的这么复杂。比如:已经定义好的方法void a(int i)
,由于业务需要,要增加个入口参数j
,这个参数对方法的执行只有很少一点影响,即大部分代码会是相同的,那么就可以重载这个方法,增加入口参数,将a的实现转入到新方法中,a 的方法调用这个新的方法
桥接模式
系统中存在两个维度的变化时,可考虑使用此模式,如毛笔与颜色,两者可以独扩展。抽象类拥有实现抽象类的引用,客户端实例化时,才确定使用是的实现类的哪个子类,这是一个维度的扩展;抽象类也具体自己的子类,也是在客户端实例化时才能确定是哪个子类。这就是两个维度了,客户端实例化抽象类的子类时,同时也能确定此子类实际引用的实现类的子类是哪个。这样就完成了两个维度的分隔。
毛笔的例子中,毛笔就是抽象类,有大小各异的毛笔;实现类就是颜色,也有不同的颜色。用户在使用毛笔时,会同时选择一个颜色来使用,这样就最终实例化完成了
组合模式
前老板给过建议,宁用组合,不用继承。但是表达的概念与此处的组合模式不同,他的建议是继承会把关系写死,组合灵活很多。
此处,组合模式定义了一个抽象构件类,可以代表叶子节点,也可以代表容器,即可以自己包含自己。一个抽象对象,一个引对象的list 构成了组合模式的基础,抽象对象可以子类化不同的类,这些类都可以add 进入list,客户端遍历list 可以完成所有操作
装饰模式
动态地给对象增加额外功能;
也就是说装饰模式是适应新需求而添加新功能,并且不影响其他对象的一种模式;
需要再加深点理解
外观模式
将客户端与子系统的内部复杂性分开,使得客户端只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道。如文件加密功能,客户端只需要调用外观类的加密方法,加密方法再调用打开文件/加密字符串/写入文件等操作;
这样就要为每个客户端调用的方法定义不同的外观类方法,貌似职责挺重。
为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端使用特别方便。此模式不会给系统增加新的功能,只是简化调用接口