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>