Skip to content

Commit 0e33bde

Browse files
committed
Added Memento and Observer
1 parent 54056be commit 0e33bde

File tree

2 files changed

+227
-0
lines changed

2 files changed

+227
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package com.behavioral.memento;
2+
3+
import com.squareup.javapoet.*;
4+
5+
import javax.lang.model.element.Modifier;
6+
7+
public class memento {
8+
public static void main(String[] args) {
9+
10+
String input1 = "Memento";
11+
String input2 = "Caretaker";
12+
String input3 = "Originator";
13+
String packageName = "com.BehavioralDP.memento";
14+
15+
// Memento class declaration
16+
ClassName Memento = ClassName.get("",input1);
17+
FieldSpec state = FieldSpec.builder(int.class,"state")
18+
.addModifiers(Modifier.PRIVATE)
19+
.build();
20+
MethodSpec getstate = MethodSpec.methodBuilder("getState")
21+
.addModifiers(Modifier.PUBLIC)
22+
.returns(int.class)
23+
.addStatement("return $N", "state")
24+
.build();
25+
TypeSpec memento = TypeSpec.classBuilder(Memento)
26+
.addModifiers(Modifier.PUBLIC)
27+
.addJavadoc("""
28+
Memento stores internal state of the Originator object, protects against
29+
access by objects other than the Originator.""")
30+
.addField(state)
31+
.addMethod(MethodSpec.constructorBuilder()
32+
.addModifiers(Modifier.PUBLIC)
33+
.addParameter(int.class,"state")
34+
.addStatement("this.$N = $N",state.name,"state")
35+
.build())
36+
.addMethod(getstate)
37+
.build();
38+
JavaFile class1 = JavaFile.builder(packageName, memento)
39+
.skipJavaLangImports(true)
40+
.build();
41+
42+
// Caretaker class declaration
43+
ClassName Caretaker = ClassName.get("",input2);
44+
TypeSpec caretaker = TypeSpec.classBuilder(Caretaker)
45+
.addModifiers(Modifier.PUBLIC)
46+
.addJavadoc("""
47+
Caretaker responsible for the Memento's safekeeping.""")
48+
.addField(Memento, "memento",Modifier.PRIVATE)
49+
.addMethod(MethodSpec.methodBuilder("getMemento")
50+
.addModifiers(Modifier.PUBLIC)
51+
.returns(Memento)
52+
.addStatement("return $N","memento")
53+
.build())
54+
.addMethod(MethodSpec.methodBuilder("setMemento")
55+
.addModifiers(Modifier.PUBLIC)
56+
.returns(TypeName.VOID)
57+
.addParameter(Memento, "memento")
58+
.addStatement("this.$N = memento","memento")
59+
.build())
60+
.build();
61+
JavaFile class2 = JavaFile.builder(packageName,caretaker)
62+
.skipJavaLangImports(true)
63+
.build();
64+
65+
// Originator class declaration
66+
ClassName Originator = ClassName.get("",input3);
67+
TypeSpec originator = TypeSpec.classBuilder(Originator)
68+
.addModifiers(Modifier.PUBLIC)
69+
.addJavadoc("""
70+
Originator creates a Memento containing a snapshot of its current internal
71+
state. Originator use Memento to restore its internal state.""")
72+
.addField(state)
73+
.addMethod(MethodSpec.methodBuilder("setMemento")
74+
.addModifiers(Modifier.PUBLIC)
75+
.returns(TypeName.VOID)
76+
.addParameter(Memento, "memento")
77+
.addStatement("this.$N = $N.$N()",state.name,"memento",getstate.name)
78+
.build())
79+
.addMethod(MethodSpec.methodBuilder("createMemento")
80+
.addModifiers(Modifier.PUBLIC)
81+
.returns(Memento)
82+
.addStatement("return new $T(this.$N)",Memento,state.name)
83+
.build())
84+
.addMethod(getstate)
85+
.addMethod(MethodSpec.methodBuilder("setState")
86+
.addModifiers(Modifier.PUBLIC)
87+
.returns(TypeName.VOID)
88+
.addParameter(int.class, "state")
89+
.addStatement("this.$N = $N",state.name,"state")
90+
.build())
91+
.build();
92+
JavaFile class3 = JavaFile.builder(packageName,originator)
93+
.skipJavaLangImports(true)
94+
.build();
95+
96+
System.out.println(class1);
97+
System.out.println(class2);
98+
System.out.println(class3);
99+
}
100+
}
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package com.behavioral.observer;
2+
3+
import com.squareup.javapoet.*;
4+
5+
import javax.lang.model.element.Modifier;
6+
7+
public class observer {
8+
public static void main(String[] args) {
9+
String input1 = "Observer";
10+
String input2 = "Subject";
11+
String input3 = "ConcreteSubject";
12+
String input4 = "ConcreteObserver";
13+
String packageName = "com.BehavioralDP.observer";
14+
15+
// Observer interface declaration
16+
ClassName Observer = ClassName.get("",input1);
17+
MethodSpec update = MethodSpec.methodBuilder("update")
18+
.addModifiers(Modifier.PUBLIC,Modifier.ABSTRACT).returns(TypeName.VOID)
19+
.build();
20+
TypeSpec component = TypeSpec.interfaceBuilder(Observer)
21+
.addModifiers(Modifier.PUBLIC)
22+
.addJavadoc("Observer defines an updating interface for objects that should be notified of changes in a subject.")
23+
.addMethod(update)
24+
.build();
25+
JavaFile class1 = JavaFile.builder(packageName,component)
26+
.skipJavaLangImports(true)
27+
.build();
28+
29+
// Subject class declaration
30+
ClassName Subject = ClassName.get("",input2);
31+
ClassName list = ClassName.get("java.util", "List");
32+
ClassName arrayList = ClassName.get("java.util", "ArrayList");
33+
ClassName Iterator = ClassName.get("java.util","Iterator");
34+
TypeName listOfObservers = ParameterizedTypeName.get(list,Observer);
35+
36+
FieldSpec obs = FieldSpec.builder(listOfObservers,"observers",Modifier.PRIVATE)
37+
.initializer("new $T<$T>()",arrayList,Observer)
38+
.build();
39+
MethodSpec notifyObs = MethodSpec.methodBuilder("notifyObservers")
40+
.addModifiers(Modifier.PUBLIC).returns(TypeName.VOID)
41+
.beginControlFlow("($T iterator = $N.iterator(); iterator.hasNext();)",Iterator,obs.name)
42+
.addStatement("$T observer = ($T) iterator.next()",Observer,Observer)
43+
.addStatement("observer.$N()",update.name)
44+
.endControlFlow()
45+
.build();
46+
TypeSpec subject = TypeSpec.classBuilder(Subject)
47+
.addModifiers(Modifier.ABSTRACT)
48+
.addJavadoc("Subject knows its observers. Any number of Observer objects may observe a subject.")
49+
.addField(obs)
50+
.addMethod(MethodSpec.methodBuilder("attach")
51+
.addModifiers(Modifier.PUBLIC).returns(TypeName.VOID)
52+
.addParameter(Observer,"observer")
53+
.addStatement("$N.add(observer)",obs.name)
54+
.build())
55+
.addMethod(MethodSpec.methodBuilder("detach")
56+
.addModifiers(Modifier.PUBLIC).returns(TypeName.VOID)
57+
.addParameter(Observer,"observer")
58+
.addStatement("$N.remove(observer)",obs.name)
59+
.build())
60+
.addMethod(notifyObs)
61+
.build();
62+
JavaFile class2 = JavaFile.builder(packageName,subject)
63+
.skipJavaLangImports(true).build();
64+
65+
// ConcreteSubject class declaration
66+
ClassName ConcreteSubject = ClassName.get("",input3);
67+
FieldSpec state = FieldSpec.builder(int.class,"state",Modifier.PRIVATE).build();
68+
MethodSpec getstate = MethodSpec.methodBuilder("getState")
69+
.addModifiers(Modifier.PUBLIC).returns(int.class)
70+
.addStatement("return $N", state.name)
71+
.build();
72+
TypeSpec concSub = TypeSpec.classBuilder(ConcreteSubject)
73+
.superclass(Subject)
74+
.addModifiers(Modifier.PUBLIC)
75+
.addJavadoc("""
76+
ConcreteSubject stores state of interest to ConcreteObserver objects, sends a notification to its observers
77+
when its state changes.""")
78+
.addField(state)
79+
.addMethod(getstate)
80+
.addMethod(MethodSpec.methodBuilder("setState")
81+
.addModifiers(Modifier.PUBLIC).returns(TypeName.VOID)
82+
.addParameter(int.class, "state")
83+
.addStatement("this.$N = state",state.name)
84+
.addStatement("this.$N()",notifyObs.name)
85+
.build())
86+
.build();
87+
JavaFile class3 = JavaFile.builder(packageName,concSub)
88+
.skipJavaLangImports(true).build();
89+
90+
// ConcreteObserver class declaration
91+
ClassName ConcreteObserver = ClassName.get("",input4);
92+
FieldSpec obsState = FieldSpec.builder(int.class, "observerState",Modifier.PRIVATE).build();
93+
FieldSpec subjectField = FieldSpec.builder(ConcreteSubject, "subject",Modifier.PRIVATE).build();
94+
TypeSpec concObs = TypeSpec.classBuilder(ConcreteObserver)
95+
.addModifiers(Modifier.PUBLIC)
96+
.addSuperinterface(Observer)
97+
.addJavadoc("""
98+
ConcreteObserver maintains a reference to a ConcreteSubject object, stores
99+
state that should stay consistent with the subject's, implements the Observer
100+
updating interface to keep its state consistent with the subject's.""")
101+
.addField(obsState)
102+
.addField(subjectField)
103+
.addMethod(MethodSpec.constructorBuilder()
104+
.addModifiers(Modifier.PUBLIC)
105+
.addParameter(ConcreteSubject, "subject")
106+
.addStatement("this.$N = subject",subjectField.name)
107+
.build())
108+
.addMethod(MethodSpec.methodBuilder("update")
109+
.addModifiers(Modifier.PUBLIC).returns(TypeName.VOID)
110+
.addStatement("$N = subject.$N()",obsState.name,getstate.name)
111+
.build())
112+
.addMethod(MethodSpec.methodBuilder("getObserverState")
113+
.addModifiers(Modifier.PROTECTED).returns(int.class)
114+
.addStatement("return $N",obsState.name)
115+
.build())
116+
.build();
117+
JavaFile class4 = JavaFile.builder(packageName,concObs)
118+
.skipJavaLangImports(true).build();
119+
120+
121+
System.out.println(class1);
122+
System.out.println(class2);
123+
System.out.println(class3);
124+
System.out.println(class4);
125+
126+
}
127+
}

0 commit comments

Comments
 (0)