interface PhoneState {
pickUp(): PhoneState;
hangUp(): PhoneState;
dial(): PhoneState;
}
class HangUp implements PhoneState {
pickUp(): PhoneState {
return new PickUp();
}
hangUp(): PhoneState {
console.log("already hang up");
return this;
}
dial(): PhoneState {
console.log("unable to dial in hang up state");
return this;
}
}
class PickUp implements PhoneState {
pickUp(): PhoneState {
console.log("already picked up");
return this;
}
hangUp(): PhoneState {
return new HangUp();
}
dial(): PhoneState {
return new Dialing();
}
}
class Dialing implements PhoneState {
pickUp(): PhoneState {
console.log("already picked up");
return this;
}
hangUp(): PhoneState {
return new HangUp();
}
dial(): PhoneState {
console.log("already dialing");
return this;
}
}
class Phone {
private state: PhoneState = new HangUp();
pickUp() {
this.state = this.state.pickUp();
}
hangUp() {
this.state = this.state.hangUp();
}
dial() {
this.state = this.state.dial();
}
}