-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.ts
135 lines (116 loc) · 2.8 KB
/
app.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
interface IMotor {
_revs: number;
SetRev(revs: number);
GetStatus(): string;
}
//interface is not used. Logger classes are used.
interface ILogger {
LogMessage(message: string);
}
class ConsoleLogger implements ILogger {
LogMessage(message: string) {
console.log(message);
}
}
class HttpLogger implements ILogger {
LogMessage(message: string) {
//$("#result").append("<p>" + message);
console.log("<p>" + message);
}
}
abstract class Motor implements IMotor {
_revs: number = 0;
SetRev(revs) {
this._revs += revs;
if (this._revs < 0) {
this._revs = 0;
}
}
GetStatus() {
return "";
}
}
/**
* Motor
*/
class ElectricMotor extends Motor implements IMotor {
_revs: number = 0;
_voltage: number = 0;
SetRev(revs) {
super.SetRev(revs);
this._voltage = this._revs * 5;
}
GetStatus() {
return "Electric Motor goes at " + this._revs + " with voltage: " + this._voltage;
}
}
/**
* Motor
*/
class InternalCombustionMotor extends Motor implements IMotor {
_revs: number = 0;
_drossel: number = 0;
SetRev(revs) {
super.SetRev(revs);
this._drossel = this._revs * 10;
}
GetStatus(): string {
return "Internal Combustion Motor goes at " + this._revs + " with drossel: " + this._drossel;
}
}
/**
* Car
*/
class Car {
private _motor: IMotor;
private _loggerMethod: (x: string) => void;
constructor(motor: IMotor, loggerMethod: (x: string) => void) {
this._motor = motor;
this._loggerMethod = loggerMethod;
}
public SetMotor(motor: IMotor) {
this._motor = motor;
}
public GetMotor(): IMotor {
return this._motor;
}
public GoFaster(): void {
this._motor.SetRev(10);
}
public GoSlower(): void {
this._motor.SetRev(-10);
}
public GetStatus(): string {
return this._motor.GetStatus();
}
public LogStatus(message): void {
if (this._loggerMethod) {
this._loggerMethod(message);
}
}
}
(function () {
let emotor = new ElectricMotor();
let pmotor = new InternalCombustionMotor();
//add logging dependency.
//let logger = new ConsoleLogger();
let logger = new HttpLogger();
//initialize with one dependency
let c = new Car(emotor, logger.LogMessage);
c.LogStatus(c.GetStatus());
c.GoFaster();
c.LogStatus(c.GetStatus());
c.GoFaster();
c.LogStatus(c.GetStatus());
c.GoSlower();
c.LogStatus(c.GetStatus());
//insert another dependency
c.SetMotor(pmotor);
c.LogStatus(c.GetStatus());
c.GoFaster();
c.LogStatus(c.GetStatus());
c.GoFaster();
c.LogStatus(c.GetStatus());
c.GoSlower();
c.LogStatus(c.GetStatus());
} ());