2.3.2 使用注釋替代Visitor模式
在J2SE 5.0以前,我們在設計應用的時候,我們經常會使用Visitor這個設計模式。 Visitor這個模式一般是用於為我們已經設計好了一組類添加方法,而不需要擔心改變定 義好的類。比如說我們已經定義了好了一組類結構,但是我們希望將這些類的對象部分數 據輸出到某種格式的文件中。
Vistor模式的實現
使用Vistor模式,首先我們在Employee這個類中加入export方法,export方法如圖11 所示。Export方法接受Exporter對象作為參數,並在方法體中調用exporter對象的visit ()方法。
圖11 使用Vistor模式實現格式輸出
在這裡我們定義了一個Exporter抽象類,我們可以通過繼承Exporter類,重寫其visit 方法來實現不同格式的文件輸出。圖11種給出visit方法的實現是一個簡單的例子。如果 要實現輸出成XML格式的,可以定義Exporter子類:XMLExporter。如果希望輸出成文本的 可以定義TXTExporter。但是這樣做不夠靈活的地方在於,如果Employee加入其他的域變 量,那麼相應的visitor類也需要進行修改。這就違反了面向對象Open for Extension, close for Modification的原則。
使用注釋替代Vistor模式
使用注釋(Annotation),也可以完成數據輸出的功能。首先定義一個新的注釋類型 :@Exportable。然後定義一個抽象的解釋器ExportableGenerator,將Employee 對象傳 入解釋器。在解釋器中,查找哪些域使用了Exportable這個注釋(Annotation),將這些 域(FIEld)按照一定格式輸出。圖12給出了Exportable注釋的定義。
清單16注釋Exportable的定義
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Exportable {
}
清單17-清單20中給出了包含數據的這些類的定義以及這些類是如何使用注釋 Exportable的。圖18定義了Main函數,使用ExporterGenerator來產生輸出文件。清單21 給出了使用注釋來實現這一功能的兩個類:ExporterGenerator和TXTExporterGenerator 。其中ExporterGenerator定義了一個基本的框架。而TXTExporterGenerator繼承了 ExporterGenerator,並且重寫了outputFIEld方法,在這個方法中實現了特定格式的輸出 。用戶可以繼承這個ExporterGenerator,並且實現其中的抽象方法來定義自己期望的格 式。
清單17 Employee的類定義
public abstract class Employee {
public abstract String getName();
public abstract String getEmpNo();
public Employee() {
super();
}
}