@@ -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
185185final 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
197197final 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 {
221221final 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-
315314struct 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 {
332331final 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-
351348func spamMonster( message: String , worker: MessageSending ) {
352349 worker. send ( message: message)
353350}
@@ -375,7 +372,6 @@ typealias Memento = NSDictionary
375372/*:
376373Originator
377374*/
378-
379375protocol 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/*:
416410Caretaker
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.
458451Other 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.
511504The 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
536529protocol State {
@@ -580,11 +573,11 @@ protocol PrintStrategy {
580573final 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*/
623616protocol 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
629623protocol 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
656659let 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