Skip to content

Commit b6e4877

Browse files
authored
Merge pull request ochococo#69 from ennioma/master
Tried to make the Mediator pattern more generic
2 parents a2c9004 + e1f63cb commit b6e4877

File tree

4 files changed

+66
-39
lines changed

4 files changed

+66
-39
lines changed

Design-Patterns.playground.zip

5.42 KB
Binary file not shown.

Design-Patterns.playground/Pages/Behavioral.xcplaygroundpage/Contents.swift

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -311,41 +311,50 @@ The mediator pattern is used to reduce coupling between classes that communicate
311311

312312
### Example
313313
*/
314-
struct Programmer {
314+
protocol Receiver {
315+
associatedtype MessageType
316+
func receive(message: MessageType)
317+
}
315318

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+
}
317327

328+
struct Programmer: Receiver {
329+
let name: String
330+
318331
init(name: String) {
319332
self.name = name
320333
}
321-
334+
322335
func receive(message: String) {
323336
print("\(name) received: \(message)")
324337
}
325338
}
326339

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+
335343
func add(recipient: Programmer) {
336344
recipients.append(recipient)
337345
}
338-
346+
339347
func send(message: String) {
340348
for recipient in recipients {
341349
recipient.receive(message: message)
342350
}
343351
}
344352
}
353+
345354
/*:
346355
### Usage
347356
*/
348-
func spamMonster(message: String, worker: MessageSending) {
357+
func spamMonster(message: String, worker: MessageMediator) {
349358
worker.send(message: message)
350359
}
351360

README.md

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -365,44 +365,53 @@ The mediator pattern is used to reduce coupling between classes that communicate
365365

366366
```swift
367367

368-
struct Programmer {
368+
protocol Receiver {
369+
associatedtype MessageType
370+
func receive(message: MessageType)
371+
}
369372

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+
}
371381

382+
struct Programmer: Receiver {
383+
let name: String
384+
372385
init(name: String) {
373386
self.name = name
374387
}
375-
388+
376389
func receive(message: String) {
377390
print("\(name) received: \(message)")
378391
}
379392
}
380393

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+
389397
func add(recipient: Programmer) {
390398
recipients.append(recipient)
391399
}
392-
400+
393401
func send(message: String) {
394402
for recipient in recipients {
395403
recipient.receive(message: message)
396404
}
397405
}
398406
}
407+
399408
```
400409

401410
### Usage
402411

403412
```swift
404413

405-
func spamMonster(message: String, worker: MessageSending) {
414+
func spamMonster(message: String, worker: MessageMediator) {
406415
worker.send(message: message)
407416
}
408417

source/behavioral/mediator.swift

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,41 +6,50 @@ The mediator pattern is used to reduce coupling between classes that communicate
66

77
### Example
88
*/
9-
struct Programmer {
9+
protocol Receiver {
10+
associatedtype MessageType
11+
func receive(message: MessageType)
12+
}
1013

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+
}
1222

23+
struct Programmer: Receiver {
24+
let name: String
25+
1326
init(name: String) {
1427
self.name = name
1528
}
16-
29+
1730
func receive(message: String) {
1831
print("\(name) received: \(message)")
1932
}
2033
}
2134

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+
3038
func add(recipient: Programmer) {
3139
recipients.append(recipient)
3240
}
33-
41+
3442
func send(message: String) {
3543
for recipient in recipients {
3644
recipient.receive(message: message)
3745
}
3846
}
3947
}
48+
4049
/*:
4150
### Usage
4251
*/
43-
func spamMonster(message: String, worker: MessageSending) {
52+
func spamMonster(message: String, worker: MessageMediator) {
4453
worker.send(message: message)
4554
}
4655

0 commit comments

Comments
 (0)