File tree 4 files changed +66
-39
lines changed
Design-Patterns.playground/Pages/Behavioral.xcplaygroundpage
4 files changed +66
-39
lines changed Original file line number Diff line number Diff line change @@ -311,41 +311,50 @@ The mediator pattern is used to reduce coupling between classes that communicate
311
311
312
312
### Example
313
313
*/
314
- struct Programmer {
314
+ protocol Receiver {
315
+ associatedtype MessageType
316
+ func receive( message: MessageType )
317
+ }
315
318
316
- let name : String
319
+ protocol Sender {
320
+ associatedtype MessageType
321
+ associatedtype ReceiverType : Receiver
322
+
323
+ var recipients : [ ReceiverType ] { get }
324
+
325
+ func send( message: MessageType )
326
+ }
317
327
328
+ struct Programmer : Receiver {
329
+ let name : String
330
+
318
331
init ( name: String ) {
319
332
self . name = name
320
333
}
321
-
334
+
322
335
func receive( message: String ) {
323
336
print ( " \( name) received: \( message) " )
324
337
}
325
338
}
326
339
327
- protocol MessageSending {
328
- func send( message: String )
329
- }
330
-
331
- final class MessageMediator : MessageSending {
332
-
333
- private var recipients : [ Programmer ] = [ ]
334
-
340
+ final class MessageMediator : Sender {
341
+ internal var recipients : [ Programmer ] = [ ]
342
+
335
343
func add( recipient: Programmer ) {
336
344
recipients. append ( recipient)
337
345
}
338
-
346
+
339
347
func send( message: String ) {
340
348
for recipient in recipients {
341
349
recipient. receive ( message: message)
342
350
}
343
351
}
344
352
}
353
+
345
354
/*:
346
355
### Usage
347
356
*/
348
- func spamMonster( message: String , worker: MessageSending ) {
357
+ func spamMonster( message: String , worker: MessageMediator ) {
349
358
worker. send ( message: message)
350
359
}
351
360
Original file line number Diff line number Diff line change @@ -365,44 +365,53 @@ The mediator pattern is used to reduce coupling between classes that communicate
365
365
366
366
``` swift
367
367
368
- struct Programmer {
368
+ protocol Receiver {
369
+ associatedtype MessageType
370
+ func receive (message : MessageType)
371
+ }
369
372
370
- let name: String
373
+ protocol Sender {
374
+ associatedtype MessageType
375
+ associatedtype ReceiverType : Receiver
376
+
377
+ var recipients: [ReceiverType] { get }
378
+
379
+ func send (message : MessageType)
380
+ }
371
381
382
+ struct Programmer : Receiver {
383
+ let name: String
384
+
372
385
init (name : String ) {
373
386
self .name = name
374
387
}
375
-
388
+
376
389
func receive (message : String ) {
377
390
print (" \( name ) received: \( message ) " )
378
391
}
379
392
}
380
393
381
- protocol MessageSending {
382
- func send (message : String )
383
- }
384
-
385
- final class MessageMediator : MessageSending {
386
-
387
- private var recipients: [Programmer] = []
388
-
394
+ final class MessageMediator : Sender {
395
+ internal var recipients: [Programmer] = []
396
+
389
397
func add (recipient : Programmer) {
390
398
recipients.append (recipient)
391
399
}
392
-
400
+
393
401
func send (message : String ) {
394
402
for recipient in recipients {
395
403
recipient.receive (message : message)
396
404
}
397
405
}
398
406
}
407
+
399
408
```
400
409
401
410
### Usage
402
411
403
412
``` swift
404
413
405
- func spamMonster (message : String , worker : MessageSending ) {
414
+ func spamMonster (message : String , worker : MessageMediator ) {
406
415
worker.send (message : message)
407
416
}
408
417
Original file line number Diff line number Diff line change @@ -6,41 +6,50 @@ The mediator pattern is used to reduce coupling between classes that communicate
6
6
7
7
### Example
8
8
*/
9
- struct Programmer {
9
+ protocol Receiver {
10
+ associatedtype MessageType
11
+ func receive( message: MessageType )
12
+ }
10
13
11
- let name : String
14
+ protocol Sender {
15
+ associatedtype MessageType
16
+ associatedtype ReceiverType : Receiver
17
+
18
+ var recipients : [ ReceiverType ] { get }
19
+
20
+ func send( message: MessageType )
21
+ }
12
22
23
+ struct Programmer : Receiver {
24
+ let name : String
25
+
13
26
init ( name: String ) {
14
27
self . name = name
15
28
}
16
-
29
+
17
30
func receive( message: String ) {
18
31
print ( " \( name) received: \( message) " )
19
32
}
20
33
}
21
34
22
- protocol MessageSending {
23
- func send( message: String )
24
- }
25
-
26
- final class MessageMediator : MessageSending {
27
-
28
- private var recipients : [ Programmer ] = [ ]
29
-
35
+ final class MessageMediator : Sender {
36
+ internal var recipients : [ Programmer ] = [ ]
37
+
30
38
func add( recipient: Programmer ) {
31
39
recipients. append ( recipient)
32
40
}
33
-
41
+
34
42
func send( message: String ) {
35
43
for recipient in recipients {
36
44
recipient. receive ( message: message)
37
45
}
38
46
}
39
47
}
48
+
40
49
/*:
41
50
### Usage
42
51
*/
43
- func spamMonster( message: String , worker: MessageSending ) {
52
+ func spamMonster( message: String , worker: MessageMediator ) {
44
53
worker. send ( message: message)
45
54
}
46
55
You can’t perform that action at this time.
0 commit comments