第 7 卷
} }
} catch (Exception e) { //异常处理
System.out.println("shit");
e.printStackTrace();
} }
}
多备份的备忘录:略封装得更好一点:保证只能对发起人可读
●建立一个空接口 IMemento——什么方法属性都没有的接口,然后在发起人 Originator 类中建立一个内置类(也叫做类中类)Memento 实现 IMemento 接口,
同时也实现自己的业务逻辑。
19.访问者模式(Visitor Pattern)
定义:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of
the elements on which it operates.(封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。)
- Visitor——抽象访问者
抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是 visit 方法的参数定义哪些对象是可以被访问的。
- ConcreteVisitor——具体访问者
它影响访问者访问到一个类后该怎么干,要做什么事情。
- Element——抽象元素
接口或者抽象类,声明接受哪一类访问者访问,程序上是通过 accept 方法中的参数来定义的。
- ConcreteElement——具体元素
实现 accept 方法,通常是 visitor.visit(this),基本上都形成了一种模式了。
- ObjectStruture——结构对象
元素产生者,一般容纳在多个不同类、不同接口的容器,如 List、Set、Map 等,在项目中,一般很少抽象出这个角色。
- 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些
依赖于其具体类的操作,也就说是用迭代器模式已经不能胜任的情景。
- 需要对一个对象结构中的对象进行很多不同并且不相关的操作,而你想避免让这
些操作“污染”这些对象的类。
20.状态模式(复杂)
定义:Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时允许其改变行
为,这个对象看起来像改变了其类。)
- State——抽象状态角色
接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。
- ConcreteState——具体状态角色
每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。
- Context——环境角色
定义客户端需要的接口,并且负责具体状态的切换。
使用场景:
- 行为随状态改变而改变的场景
这也是状态模式的根本出发点,例如权限设计,人员的状态不同即使执行相同的行为结果也会不同,在这种情况下需要考虑使用状态模式。
- 条件、分支判断语句的替代者
注意:
状态模式适用于当某个对象在它的状态发生改变时,它的行为也随着发生比较大的变化,也就是说在行为受状态约束的情况下可以使用状态模式,而且使用时对象的
状态最好不要超过 5 个。
21.解释器模式(Interpreter Pattern)
(少用)
定义:Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
(给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。)
具体的解释任务由各个实现类完成,具体的解释器分别由 TerminalExpression 和 Non-terminalExpression 完成。
- TerminalExpression——终结符表达式
实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。具体到我们例子就是 VarExpression
类,表达式中的每个终结符都在栈中产生了一个 VarExpression 对象。
- NonterminalExpression——非终结符表达式
文法中的每条规则对应于一个非终结表达式,具体到我们的例子就是加减法规则分别对应到 AddExpression 和 SubExpression 两个类。非终结符表达式根据逻辑的
复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。
- Context——环境角色
具体到我们的例子中是采用 HashMap 代替。
使用场景:
- 重复发生的问题可以使用解释器模式
- 一个简单语法需要解释的场景
注意:
尽量不要在重要的模块中使用解释器模式,否则维护会是一个很大的问题。在项目中可以使用 shell、JRuby、Groovy 等脚本语言来代替解释器模式,弥补 Java 编
译型语言的不足。
22.享元模式(Flyweight Pattern)
定义:Use sharing to support large numbers of fine-grained objects efficiently.
(使用共享对象可有效地支持大量的细粒度的对象。)
对象的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。
- 内部状态
内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变。
- 外部状态
外部状态是对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态。
- Flyweight——抽象享元角色
它简单地说就是一个产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现。
- ConcreteFlyweight——具体享元角色
具体的一个产品类,实现抽象角色定义的业务。该角色中需要注意的是内部状态处理应该与环境无关,不应该出现一个操作改变了内部状态,同时修改了外部状态,
这是绝对不允许的。