Skip to content

Commit ea76850

Browse files
committed
Added state pattern example
1 parent 30a83f9 commit ea76850

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed

state/state.ts

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
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

Comments
 (0)