asato <asato@ncfreak.com>
最終更新日 : 2002/9/26 (2002/9/26 より)
Builder
考慮点
AspectJ を使った Builder に関するテクニックの種類
特化した作成過程
サンプルコード:
package dp.builder;
public interface Builder {
public void buildPartA();
public void buildPartB();
}
package dp.builder;
public class ConcreteBuilderA implements Builder {
private String result = "";
public void buildPartA() {
this.result += "PartA ";
}
public void buildPartB() {
this.result += "PartB ";
}
public String getResult() {
return result;
}
}
package dp.builder;
public class ConcreteBuilderB implements Builder {
private String result = "";
public void buildPartA() {
this.result = "<PartA>" + result + "</PartA>";
}
public void buildPartB() {
this.result = "<PartB>" + result + "</PartB>";
}
public String getResult() {
return result;
}
}
package dp.builder;
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.buildPartA();
builder.buildPartB();
}
}
package dp;
import dp.builder.*;
public class Client {
public static void main(String[] args) {
ConcreteBuilderA builderA = new ConcreteBuilderA();
ConcreteBuilderB builderB = new ConcreteBuilderB();
new Director( builderA ).construct();
new Director( builderB ).construct();
System.out.println( builderA.getResult() );
System.out.println( builderB.getResult() );
}
}
package dp.builder;
privileged aspect BuilderAspect {
pointcut construct() : withincode( void Director.construct() );
pointcut buildPartB(ConcreteBuilderB builder) :
target(builder) && call( void Builder.buildPartB() ) && construct();
after(ConcreteBuilderB builder) : buildPartB(builder) {
builder.buildPartC();
}
private void ConcreteBuilderB.buildPartC() {
this.result = "<PartC>" + result + "</PartC>";
}
}
PartA PartB <PartC><PartB><PartA></PartA></PartB></PartC>