-
Notifications
You must be signed in to change notification settings - Fork 0
/
bridge.js
148 lines (112 loc) · 3.65 KB
/
bridge.js
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
136
137
138
139
140
141
142
143
144
145
146
147
148
// Bridge Pattern
// it allow us to decouple an abstraction from its implementation so that the two can vary independently.
// two componets to work together each componet having its own interface
// also refer as double Adapter pattern
// example is an application that is using two different databases and we want to use the same code for both the databases
class MySQL {
constructor() {
this.name = 'MySQL';
this.toString = function () {
return this.name;
};
}
}
class Oracle {
constructor() {
this.name = 'Oracle';
this.toString = function () {
return this.name;
};
}
}
class Connection {
constructor(db) {
this.database = db;
}
connect() {
return 'Connected: ' + this.database.toString();
}
}
function runB() {
let oracle = new Oracle();
let mySQL = new MySQL();
let oracleConnection = new Connection(oracle);
let mySQLConnection = new Connection(mySQL);
console.log(oracleConnection.connect());
console.log(mySQLConnection.connect());
}
runB();
// Javascript does not have abstract classes
// Another example is input and output streams
let Gesture = function (output) {
this.output = output;
this.tap = function () { this.output.click(); };
this.swipe = function () { this.output.move(); };
this.pan = function () { this.output.drag(); };
this.pinch = function () { this.output.zoom(); }
}
let Mouse = function (output) {
this.output = output;
this.click = function () { this.output.write("Mouse click"); };
this.move = function () { this.output.write("Mouse move"); };
this.drag = function () { this.output.write("Mouse drag"); };
this.wheel = function () { this.output.write("Mouse wheel"); };
this.down = function () { this.output.write("Mouse down"); };
this.up = function () { this.output.write("Mouse up"); };
this.zoom = function () { this.output.write("Zoom over"); };
}
let Screen = function () {
this.write = function (msg) { console.log(msg); };
}
function runC() {
let screen = new Screen();
let mouse = new Mouse(screen);
let gesture = new Gesture(mouse);
gesture.tap();
gesture.swipe();
gesture.pan();
gesture.pinch();
}
runC();
// Aonthe Example
// input devices
var Gestures = function (output) {
this.output = output;
this.tap = function () { this.output.click(); }
this.swipe = function () { this.output.move(); }
this.pan = function () { this.output.drag(); }
this.pinch = function () { this.output.zoom(); }
};
var MouseA = function (output) {
this.output = output;
this.click = function () { this.output.click(); }
this.move = function () { this.output.move(); }
this.down = function () { this.output.drag(); }
this.wheel = function () { this.output.zoom(); }
};
// output devices
var ScreenA = function () {
this.click = function () { console.log("Screen select"); }
this.move = function () { console.log("Screen move"); }
this.drag = function () { console.log("Screen drag"); }
this.zoom = function () { console.log("Screen zoom in"); }
};
var Audio = function () {
this.click = function () { console.log("Sound oink"); }
this.move = function () { console.log("Sound waves"); }
this.drag = function () { console.log("Sound screetch"); }
this.zoom = function () { console.log("Sound volume up"); }
};
function run() {
var screen = new ScreenA();
var audio = new Audio();
var hand = new Gestures(screen);
var mouse = new MouseA(audio);
hand.tap();
hand.swipe();
hand.pinch();
mouse.click();
mouse.move();
mouse.wheel();
}
run();