倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Iteration の DataOutputter に関連する属性

書き忘れてましたが、前回までは「状態を観測せず、出力もしないシミュレーション」を考えていました。 今回からは「データを観測して出力する」処理を“織り込み”ましょう。

今回は、まず Iteration に DataOutputter に関する属性を考えます。 Iteration に直接 DataOutputter のセットを保持させてもいいんですが、出力の処理などを一括して扱うための新たなクラス DataOutputterContainer を作成しましょう(メソッドの実装は載せてませんが具象クラスです):

public class DataOutputterContainer
        implements SimulationComponent{

    public Set<DataOutputter> getDataOutputters();
    public void addDataOutputter(DataOutputter outputter);
    public void removeDataOutputter(DataOutputter outputter);

    /**
       * 引数で指定されたタイミングで指定される
       * DataOutputter を用いて出力を行います。
       * 出力のタイミングには
       *   ・初期状態 (OutputTiming.INITIAL)
       *   ・更新後の状態 (OutputTiming.AFTER_EVOLUTION)
       *   ・終状態 (OutputTiming.FINAL)
       * の3つがあります。
       */
    public void output(OutputTiming timing);
}

AspectJ の「インタータイプ宣言」を用いて、この DataOutputterContainer を Iteration に属性として付加しましょう:

aspect DataOutputterContainerAttribute{
    
    private final DataOutputterContainer Iteration.container
        = new DataOutputterContainer();
    
    public DataOutputterContainer Iteration.getDataOutputterContainer(){
        return this.container;
    }
    
    public Set<DataOutputter> Iteration.getDataOutputters(){
        return this.container.getDataOutputters();
    }

    public void Iteration.addDataOutputter(DataOutputter outputter){
        this.container.addDataOutputter(outputter);
    }

    public void Iteration.removeDataOutputter(DataOutputter outputter){
        this.container.removeDataOutputter(outputter);
    }
}

アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ

アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ