我的设计模式3
-
享元模式
-
定义
享元模式:运用共享技术有效地支持大量细粒度的对象。
-
结构图
-
内部状态和外部状态
-在享元模式对象内部并且不会随着环境改变而改变的共享部分,可以称为是享元对象的内部状态 -随着环境改变而改变,不可以共享的状态就是外部状态。
-
享元模式的优点:
- 享元模式可以避免大量非常相似类的开销。 - 在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果发现这些实例除了几个参数外基本上都相同,有时就能够受大幅度地减少需要实例化的类的数量。 - 如果能够将那些参数转移到类的外面,在方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。
-
自己的理解:
1. 怎么有点MVC的感觉,用的view都是同一套,然后绑定不同的model就可以保证不同的view展示了 2. 还有点像模板模式呢,将所有可以公用的放在内部,然后将不可以共用的作为参数传递进去。
-
何时使用
- 如果一个应用程序使用了大量的对象,而大量的对象造成了存储开销时就应该考虑使用; - 对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以使用相对较少的共享对象取代很多组对象,此时可以使用享元模式
-
-
解释模式
-
定义
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
-
结构图
-
何时使用
- 如果一种特定类型的问题发生的频率足够高,那么可鞥呢就值得将该问题的哥哥实例表述为一个简单的语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。 - 相当于创建了一个小的语言,文法,然后用解释器来解释,和编译原理相关的知识比较近
-
优点
- 使用了解释器模式,就意味着可以很容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变或者扩展该文法。
- 也比较容易实现文法,因为定义抽象语法树各个节点的类的实现大体类似,这些类都易于直接编写。 -
缺点
- 解释器模式为文法中的每一条规则都至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时使用其他技术如语法分析器,编译器生成器来处理。
-
-
访问者模式
-
定义
访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
-
结构图
-
理解
- 将状态和行为独立出来作为一个新的类,作为参数传递给状态行为的对象; - 状态类中(visitor)针对固定对象种类要定义不同的行为。 - 双分派技术: 在给对象设定visitor的时候进行了一次选择(用户实例化进行的选择),在对象的方法内部又对visitor中包含方法进行了适合自己的二次算法选择(程序内部写死的选择)
-
何时使用
- 访问者模式适用于数据结构相对稳定的系统,指的是对象的种类是稳定的,但是对象的行为状态是不稳定的情况 - 它把数据结构和作用于数据结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。 - 访问者模式的目的是要把处理从数据结构分离出来 - 当该系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是比较合适的,因为访问者模式使得算法的操作的增加变得更加容易
-
优点
-增加新的操作比较容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
-
缺点
-增加新的数据结构变得很困难
-