Skip to content

Commit 9af97a6

Browse files
committed
Swift 3 is here!
1 parent 3f2de97 commit 9af97a6

File tree

19 files changed

+518
-544
lines changed

19 files changed

+518
-544
lines changed

Design-Patterns.playground.zip

105 Bytes
Binary file not shown.

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

Lines changed: 58 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,26 @@ The chain of responsibility pattern is used to process varied requests, each of
1919

2020
### Example:
2121
*/
22-
class MoneyPile {
22+
final class MoneyPile {
2323

2424
let value: Int
2525
var quantity: Int
2626
var nextPile: MoneyPile?
27-
27+
2828
init(value: Int, quantity: Int, nextPile: MoneyPile?) {
2929
self.value = value
3030
self.quantity = quantity
3131
self.nextPile = nextPile
3232
}
33-
33+
3434
func canWithdraw(amount: Int) -> Bool {
3535

3636
var amount = amount
3737

3838
func canTakeSomeBill(want: Int) -> Bool {
3939
return (want / self.value) > 0
4040
}
41-
41+
4242
var quantity = self.quantity
4343

4444
while canTakeSomeBill(want: amount) {
@@ -63,27 +63,27 @@ class MoneyPile {
6363
}
6464
}
6565

66-
class ATM {
66+
final class ATM {
6767
private var hundred: MoneyPile
6868
private var fifty: MoneyPile
6969
private var twenty: MoneyPile
7070
private var ten: MoneyPile
71-
71+
7272
private var startPile: MoneyPile {
7373
return self.hundred
7474
}
75-
76-
init(hundred: MoneyPile,
77-
fifty: MoneyPile,
78-
twenty: MoneyPile,
75+
76+
init(hundred: MoneyPile,
77+
fifty: MoneyPile,
78+
twenty: MoneyPile,
7979
ten: MoneyPile) {
8080

8181
self.hundred = hundred
8282
self.fifty = fifty
8383
self.twenty = twenty
8484
self.ten = ten
8585
}
86-
86+
8787
func canWithdraw(amount: Int) -> String {
8888
return "Can withdraw: \(self.startPile.canWithdraw(amount: amount))"
8989
}
@@ -184,35 +184,35 @@ protocol IntegerExpression {
184184

185185
final class IntegerContext {
186186
private var data: [Character:Int] = [:]
187-
187+
188188
func lookup(name: Character) -> Int {
189189
return self.data[name]!
190190
}
191-
191+
192192
func assign(expression: IntegerVariableExpression, value: Int) {
193193
self.data[expression.name] = value
194194
}
195195
}
196196

197197
final class IntegerVariableExpression: IntegerExpression {
198198
let name: Character
199-
199+
200200
init(name: Character) {
201201
self.name = name
202202
}
203-
203+
204204
func evaluate(_ context: IntegerContext) -> Int {
205205
return context.lookup(name: self.name)
206206
}
207-
207+
208208
func replace(character name: Character, integerExpression: IntegerExpression) -> IntegerExpression {
209209
if name == self.name {
210210
return integerExpression.copied()
211211
} else {
212212
return IntegerVariableExpression(name: self.name)
213213
}
214214
}
215-
215+
216216
func copied() -> IntegerExpression {
217217
return IntegerVariableExpression(name: self.name)
218218
}
@@ -221,21 +221,21 @@ final class IntegerVariableExpression: IntegerExpression {
221221
final class AddExpression: IntegerExpression {
222222
private var operand1: IntegerExpression
223223
private var operand2: IntegerExpression
224-
224+
225225
init(op1: IntegerExpression, op2: IntegerExpression) {
226226
self.operand1 = op1
227227
self.operand2 = op2
228228
}
229-
229+
230230
func evaluate(_ context: IntegerContext) -> Int {
231231
return self.operand1.evaluate(context) + self.operand2.evaluate(context)
232232
}
233-
233+
234234
func replace(character: Character, integerExpression: IntegerExpression) -> IntegerExpression {
235235
return AddExpression(op1: operand1.replace(character: character, integerExpression: integerExpression),
236236
op2: operand2.replace(character: character, integerExpression: integerExpression))
237237
}
238-
238+
239239
func copied() -> IntegerExpression {
240240
return AddExpression(op1: self.operand1, op2: self.operand2)
241241
}
@@ -311,15 +311,14 @@ The mediator pattern is used to reduce coupling between classes that communicate
311311

312312
### Example
313313
*/
314-
315314
struct Programmer {
316315

317316
let name: String
318-
317+
319318
init(name: String) {
320319
self.name = name
321320
}
322-
321+
323322
func receive(message: String) {
324323
print("\(name) received: \(message)")
325324
}
@@ -332,22 +331,20 @@ protocol MessageSending {
332331
final class MessageMediator: MessageSending {
333332

334333
private var recipients: [Programmer] = []
335-
334+
336335
func add(recipient: Programmer) {
337336
recipients.append(recipient)
338337
}
339-
338+
340339
func send(message: String) {
341340
for recipient in recipients {
342341
recipient.receive(message: message)
343342
}
344343
}
345344
}
346-
347345
/*:
348346
### Usage
349347
*/
350-
351348
func spamMonster(message: String, worker: MessageSending) {
352349
worker.send(message: message)
353350
}
@@ -375,7 +372,6 @@ typealias Memento = NSDictionary
375372
/*:
376373
Originator
377374
*/
378-
379375
protocol MementoConvertible {
380376
var memento: Memento { get }
381377
init?(memento: Memento)
@@ -410,8 +406,6 @@ struct GameState: MementoConvertible {
410406
return [ Keys.chapter: chapter, Keys.weapon: weapon ]
411407
}
412408
}
413-
414-
415409
/*:
416410
Caretaker
417411
*/
@@ -449,12 +443,11 @@ if let memento = CheckPoint.restore(saveName: "gameState1") {
449443
let finalState = GameState(memento: memento)
450444
dump(finalState)
451445
}
452-
453446
/*:
454447
👓 Observer
455448
-----------
456449

457-
The observer pattern is used to allow an object to publish changes to its state.
450+
The observer pattern is used to allow an object to publish changes to its state.
458451
Other objects subscribe to be immediately notified of any changes.
459452

460453
### Example
@@ -464,7 +457,7 @@ protocol PropertyObserver : class {
464457
func didChange(propertyName: String, oldPropertyValue: Any?)
465458
}
466459

467-
class TestChambers {
460+
final class TestChambers {
468461

469462
weak var observer:PropertyObserver?
470463

@@ -480,7 +473,7 @@ class TestChambers {
480473
}
481474
}
482475

483-
class Observer : PropertyObserver {
476+
final class Observer : PropertyObserver {
484477
func willChange(propertyName: String, newPropertyValue: Any?) {
485478
if newPropertyValue as? Int == 1 {
486479
print("Okay. Look. We both said a lot of things that you're going to regret.")
@@ -507,7 +500,7 @@ testChambers.testChamberNumber += 1
507500
🐉 State
508501
---------
509502

510-
The state pattern is used to alter the behaviour of an object as its internal state changes.
503+
The state pattern is used to alter the behaviour of an object as its internal state changes.
511504
The pattern allows the class for an object to apparently change at run-time.
512505

513506
### Example
@@ -530,7 +523,7 @@ final class Context {
530523
func changeStateToUnauthorized() {
531524
state = UnauthorizedState()
532525
}
533-
526+
534527
}
535528

536529
protocol State {
@@ -580,11 +573,11 @@ protocol PrintStrategy {
580573
final class Printer {
581574

582575
private let strategy: PrintStrategy
583-
576+
584577
func print(_ string: String) -> String {
585578
return self.strategy.print(string)
586579
}
587-
580+
588581
init(strategy: PrintStrategy) {
589582
self.strategy = strategy
590583
}
@@ -621,41 +614,51 @@ The visitor pattern is used to separate a relatively complex set of structured d
621614
### Example
622615
*/
623616
protocol PlanetVisitor {
624-
func visit(_ planet: PlanetAlderaan)
625-
func visit(_ planet: PlanetCoruscant)
626-
func visit(_ planet: PlanetTatooine)
617+
func visit(planet: PlanetAlderaan)
618+
func visit(planet: PlanetCoruscant)
619+
func visit(planet: PlanetTatooine)
620+
func visit(planet: PlanetJedah)
627621
}
628622

629623
protocol Planet {
630-
func accept(_ visitor: PlanetVisitor)
624+
func accept(visitor: PlanetVisitor)
631625
}
632626

633-
final class PlanetAlderaan: Planet {
634-
func accept(_ visitor: PlanetVisitor) { visitor.visit(self) }
627+
class PlanetJedah: Planet {
628+
func accept(visitor: PlanetVisitor) { visitor.visit(planet: self) }
635629
}
636-
final class PlanetCoruscant: Planet {
637-
func accept(_ visitor: PlanetVisitor) { visitor.visit(self) }
630+
631+
class PlanetAlderaan: Planet {
632+
func accept(visitor: PlanetVisitor) { visitor.visit(planet: self) }
638633
}
639-
final class PlanetTatooine: Planet {
640-
func accept(_ visitor: PlanetVisitor) { visitor.visit(self) }
634+
635+
class PlanetCoruscant: Planet {
636+
func accept(visitor: PlanetVisitor) { visitor.visit(planet: self) }
641637
}
642638

643-
final class NameVisitor: PlanetVisitor {
639+
class PlanetTatooine: Planet {
640+
func accept(visitor: PlanetVisitor) { visitor.visit(planet: self) }
641+
}
644642

643+
644+
645+
class NameVisitor: PlanetVisitor {
645646
var name = ""
646647

647-
func visit(_ planet: PlanetAlderaan) { name = "Alderaan" }
648-
func visit(_ planet: PlanetCoruscant) { name = "Coruscant" }
649-
func visit(_ planet: PlanetTatooine) { name = "Tatooine" }
648+
func visit(planet: PlanetAlderaan) { name = "Alderaan" }
649+
func visit(planet: PlanetCoruscant) { name = "Coruscant" }
650+
func visit(planet: PlanetTatooine) { name = "Tatooine" }
651+
func visit(planet: PlanetJedah) { name = "Jedah" }
650652
}
653+
651654
/*:
652655
### Usage
653656
*/
654-
let planets: [Planet] = [PlanetAlderaan(), PlanetCoruscant(), PlanetTatooine()]
657+
let planets: [Planet] = [PlanetAlderaan(), PlanetCoruscant(), PlanetTatooine(), PlanetJedah()]
655658

656659
let names = planets.map { (planet: Planet) -> String in
657660
let visitor = NameVisitor()
658-
planet.accept(visitor)
661+
planet.accept(visitor: visitor)
659662
return visitor.name
660663
}
661664

0 commit comments

Comments
 (0)