Skip to content

Commit f55fabb

Browse files
committed
Added State and Template Method
1 parent 0e33bde commit f55fabb

File tree

2 files changed

+157
-0
lines changed

2 files changed

+157
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.behavioral.state;
2+
3+
import com.squareup.javapoet.*;
4+
5+
import javax.lang.model.element.Modifier;
6+
7+
public class state {
8+
public static void main(String[] args) {
9+
String input1 = "State";
10+
String input2 = "ConcreteState";
11+
String input3 = "Context";
12+
String packageName = "com.BehavioralDP.state";
13+
14+
// State interface declaration
15+
ClassName State = ClassName.get("",input1);
16+
MethodSpec handle = MethodSpec.methodBuilder("handle")
17+
.addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT)
18+
.returns(TypeName.VOID)
19+
.build();
20+
TypeSpec state = TypeSpec.interfaceBuilder(State)
21+
.addModifiers(Modifier.PUBLIC)
22+
.addJavadoc("""
23+
The interface for encapsulating the behavior associated with a particular
24+
state of the Context.""")
25+
.addMethod(handle)
26+
.build();
27+
JavaFile class1 = JavaFile.builder(packageName,state)
28+
.skipJavaLangImports(true)
29+
.build();
30+
31+
// ConcreteState class declaration
32+
ClassName ConcreteState = ClassName.get("",input2);
33+
FieldSpec handleInv = FieldSpec.builder(TypeName.BOOLEAN,"handleInvoked")
34+
.addModifiers(Modifier.PRIVATE)
35+
.initializer("false")
36+
.build();
37+
TypeSpec concreteState = TypeSpec.classBuilder(ConcreteState)
38+
.addSuperinterface(State)
39+
.addModifiers(Modifier.PUBLIC)
40+
.addJavadoc("""
41+
ConcreteState implements a behavior associated with a state of the Context.""")
42+
.addField(handleInv)
43+
.addMethod(MethodSpec.methodBuilder(handle.name)
44+
.addModifiers(Modifier.PUBLIC)
45+
.returns(TypeName.VOID)
46+
.addStatement("this.$N = true",handleInv.name)
47+
.build())
48+
.addMethod(MethodSpec.methodBuilder("isHandleInvoked")
49+
.addModifiers(Modifier.PROTECTED)
50+
.returns(TypeName.BOOLEAN)
51+
.addStatement("return $N", handleInv)
52+
.build())
53+
.build();
54+
JavaFile class2 = JavaFile.builder(packageName,concreteState)
55+
.skipJavaLangImports(true)
56+
.build();
57+
58+
// Context class declaration
59+
ClassName Context = ClassName.get("",input3);
60+
TypeSpec context = TypeSpec.classBuilder(Context)
61+
.addModifiers(Modifier.PUBLIC)
62+
.addJavadoc("""
63+
Context maintains an instance of a ConcreteState subclass that defines the
64+
current state.""")
65+
.addField(ConcreteState, "state",Modifier.PRIVATE)
66+
.addMethod(MethodSpec.methodBuilder("request")
67+
.addModifiers(Modifier.PUBLIC)
68+
.addStatement("$N.$N()","state",handle.name)
69+
.build())
70+
.addMethod(MethodSpec.methodBuilder("setState")
71+
.addModifiers(Modifier.PUBLIC)
72+
.returns(TypeName.VOID)
73+
.addParameter(State, "state")
74+
.addStatement("this.$N = state", "state")
75+
.build())
76+
.build();
77+
JavaFile class3 = JavaFile.builder(packageName,context)
78+
.skipJavaLangImports(true)
79+
.build();
80+
81+
System.out.println(class1);
82+
System.out.println(class2);
83+
System.out.println(class3);
84+
}
85+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.behavioral.templateMethod;
2+
3+
import com.squareup.javapoet.*;
4+
5+
import javax.lang.model.element.Modifier;
6+
7+
public class templateMethod {
8+
public static void main(String[] args) {
9+
String input1 = "AbstractClass";
10+
String input2 = "ConcreteClass";
11+
String packageName = "com.BehavioralDP.templateMethod";
12+
13+
ClassName abstractclass = ClassName.get("",input1);
14+
ClassName concreteclass = ClassName.get("",input2);
15+
16+
// AbstractClass declaration
17+
MethodSpec primOp1 = MethodSpec.methodBuilder("primitiveOperation1")
18+
.addModifiers(Modifier.ABSTRACT)
19+
.returns(String.class)
20+
.build();
21+
MethodSpec primOp2 = MethodSpec.methodBuilder("primitiveOperation2")
22+
.addModifiers(Modifier.ABSTRACT)
23+
.returns(String.class)
24+
.build();
25+
26+
TypeSpec abstractC = TypeSpec.classBuilder(abstractclass)
27+
.addModifiers(Modifier.ABSTRACT)
28+
.addJavadoc("Defines interfaces for primitive operations. Implements algorithm.")
29+
.addMethod(MethodSpec.methodBuilder("templateMethod")
30+
.addModifiers(Modifier.PUBLIC)
31+
.returns(String.class)
32+
.addJavadoc("""
33+
Template method, implementation of algorithm which consists of
34+
primitiveOperations
35+
36+
@return result of the primitive operations""")
37+
.addStatement("return this.$N() + this.$N()",primOp1.name,primOp2.name)
38+
.build())
39+
.addMethod(primOp1)
40+
.addMethod(primOp2)
41+
.build();
42+
JavaFile javaFile1 = JavaFile.builder(packageName,abstractC)
43+
.skipJavaLangImports(true)
44+
.build();
45+
46+
// ConcreteClass declaration
47+
TypeSpec concreteC = TypeSpec.classBuilder(concreteclass)
48+
.superclass(abstractclass)
49+
.addJavadoc("""
50+
Implements the primitive operations to carry out subclass-specific steps of
51+
the algorithm.""")
52+
.addModifiers(Modifier.PUBLIC)
53+
.addMethod(MethodSpec.methodBuilder(primOp1.name)
54+
.addModifiers(Modifier.PUBLIC)
55+
.returns(String.class)
56+
.addStatement("return $S","Template")
57+
.build())
58+
.addMethod(MethodSpec.methodBuilder(primOp2.name)
59+
.addModifiers(Modifier.PUBLIC)
60+
.returns(String.class)
61+
.addStatement("return $S","Method")
62+
.build())
63+
.build();
64+
JavaFile javaFile2 = JavaFile.builder(packageName,concreteC)
65+
.skipJavaLangImports(true)
66+
.build();
67+
68+
System.out.println(javaFile1);
69+
System.out.println(javaFile2);
70+
71+
}
72+
}

0 commit comments

Comments
 (0)