1
+ module test {
2
+
3
+ interface State {
4
+ order : Order ;
5
+
6
+ cancelOrder ( ) ;
7
+ verifyPayment ( ) ;
8
+ shipOrder ( ) ;
9
+ }
10
+
11
+ class Order {
12
+ public cancelledOrderState : State ;
13
+ public paymentPendingState : State ;
14
+ public orderShipedState : State ;
15
+ public orderBeingPrepared : State ;
16
+
17
+ public currentState : State ;
18
+
19
+ constructor ( ) {
20
+ this . cancelledOrderState = new CancelledOrderState ( this ) ;
21
+ this . paymentPendingState = new PaymentPendingState ( this ) ;
22
+ this . orderShipedState = new OrderShippedState ( this ) ;
23
+ this . orderBeingPrepared = new OrderBeingPrepared ( this ) ;
24
+
25
+ this . setState ( this . paymentPendingState ) ;
26
+ }
27
+
28
+ public setState ( state : State ) {
29
+ this . currentState = state ;
30
+ }
31
+
32
+ public getCurrentState ( ) : State {
33
+ return this . currentState ;
34
+ }
35
+ }
36
+
37
+ class CancelledOrderState implements State {
38
+ order : Order ;
39
+
40
+ constructor ( order : Order ) {
41
+ this . order = order ;
42
+ }
43
+
44
+ public cancelOrder ( ) {
45
+ console . log ( 'This order is already cancelled' ) ;
46
+ this . order . setState ( this . order . cancelledOrderState ) ;
47
+ }
48
+
49
+ public verifyPayment ( ) {
50
+ console . log ( 'The order is cancelled, you cannot pay anymore.' ) ;
51
+ }
52
+
53
+ public shipOrder ( ) {
54
+ console . log ( 'The order is cancelled, you cannot ship it anymore.' ) ;
55
+ }
56
+ }
57
+
58
+ class PaymentPendingState implements State {
59
+ order : Order ;
60
+
61
+ constructor ( order : Order ) {
62
+ this . order = order ;
63
+ }
64
+
65
+ cancelOrder ( ) {
66
+ console . log ( 'Cancelling your unpaid order...' ) ;
67
+ this . order . setState ( this . order . cancelledOrderState ) ;
68
+ }
69
+
70
+ verifyPayment ( ) {
71
+ console . log ( 'Payment verified! Shipping soon.' ) ;
72
+ this . order . setState ( this . order . orderBeingPrepared ) ;
73
+ }
74
+ shipOrder ( ) {
75
+ console . log ( 'Cannot ship order when payment is pending!' ) ;
76
+ }
77
+ }
78
+
79
+ class OrderBeingPrepared implements State {
80
+ order : Order ;
81
+
82
+ constructor ( order : Order ) {
83
+ this . order = order ;
84
+ }
85
+
86
+ cancelOrder ( ) {
87
+ console . log ( 'Cancelling your order.. You will be refunded.' ) ;
88
+ this . order . setState ( this . order . cancelledOrderState ) ;
89
+ }
90
+ verifyPayment ( ) {
91
+ console . log ( 'Payment is already verified.' ) ;
92
+ }
93
+ shipOrder ( ) {
94
+ console . log ( 'Shipping your order now..' ) ;
95
+ this . order . setState ( this . order . orderShipedState ) ;
96
+ }
97
+ }
98
+
99
+ class OrderShippedState implements State {
100
+ order : Order ;
101
+
102
+ constructor ( order : Order ) {
103
+ this . order = order ;
104
+ }
105
+
106
+ cancelOrder ( ) {
107
+ console . log ( 'You cannot cancel an order that has been shipped.' ) ;
108
+ }
109
+ verifyPayment ( ) {
110
+ console . log ( 'Payment is already verified' ) ;
111
+ }
112
+ shipOrder ( ) {
113
+ console . log ( 'Order is already shipped' ) ;
114
+ }
115
+ }
116
+
117
+ let order = new Order ( ) ;
118
+
119
+ order . getCurrentState ( ) . verifyPayment ( ) ;
120
+ order . getCurrentState ( ) . shipOrder ( ) ;
121
+ order . getCurrentState ( ) . cancelOrder ( ) ;
122
+
123
+ console . log ( 'Order state: ' + ( < any > order . getCurrentState ( ) ) . constructor . name ) ;
124
+ }
0 commit comments