Skip to content

Commit be99c0a

Browse files
committed
Merge pull request ochococo#14 from minsOne/master
add observer and Decorator pattern section
2 parents 6c7e157 + 89f774e commit be99c0a

File tree

1 file changed

+96
-2
lines changed

1 file changed

+96
-2
lines changed

README.markdown

Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,73 @@ tuple.z
326326
```
327327

328328
##🚧 Bridge
329-
##🚧 Decorator
329+
##🍧 Decorator
330+
331+
```swift
332+
protocol Coffee {
333+
func getCost() -> Double
334+
func getIngredients() -> String
335+
}
336+
337+
class SimpleCoffee: Coffee {
338+
func getCost() -> Double {
339+
return 1.0
340+
}
341+
func getIngredients() -> String {
342+
return "Coffee"
343+
}
344+
}
345+
346+
class CoffeeDecorator: Coffee {
347+
private let decoratedCoffee: Coffee
348+
private let ingredientSeparator: String = ", "
349+
350+
required init(decoratedCoffee: Coffee) {
351+
self.decoratedCoffee = decoratedCoffee
352+
}
353+
func getCost() -> Double {
354+
return decoratedCoffee.getCost()
355+
}
356+
func getIngredients() -> String {
357+
return decoratedCoffee.getIngredients()
358+
}
359+
}
360+
361+
class Milk: CoffeeDecorator {
362+
required init(decoratedCoffee: Coffee) {
363+
super.init(decoratedCoffee: decoratedCoffee)
364+
}
365+
override func getCost() -> Double {
366+
return super.getCost() + 0.5
367+
}
368+
override func getIngredients() -> String {
369+
return super.getIngredients() + ingredientSeparator + "Milk"
370+
}
371+
}
372+
373+
class WhipCoffee: CoffeeDecorator {
374+
required init(decoratedCoffee: Coffee) {
375+
super.init(decoratedCoffee: decoratedCoffee)
376+
}
377+
override func getCost() -> Double {
378+
return super.getCost() + 0.7
379+
}
380+
override func getIngredients() -> String {
381+
return super.getIngredients() + ingredientSeparator + "Whip"
382+
}
383+
}
384+
```
385+
386+
**Usage:**
387+
```swift
388+
var someCoffee: Coffee = SimpleCoffee()
389+
println("Cost : \(someCoffee.getCost()); Ingredients: \(someCoffee.getIngredients())")
390+
someCoffee = Milk(decoratedCoffee: someCoffee)
391+
println("Cost : \(someCoffee.getCost()); Ingredients: \(someCoffee.getIngredients())")
392+
someCoffee = WhipCoffee(decoratedCoffee: someCoffee)
393+
println("Cost : \(someCoffee.getCost()); Ingredients: \(someCoffee.getIngredients())")
394+
```
395+
330396
##🚧 Proxy
331397

332398
#Behavioral
@@ -398,7 +464,35 @@ fileManager.move()
398464
##🚧 Iterator
399465
##🚧 Mediator
400466
##🚧 Memento
401-
##🚧 Observer
467+
##📩 Observer
468+
469+
```swift
470+
class StepCounter {
471+
var totalSteps: Int = 0 {
472+
willSet(newTotalSteps) {
473+
println("About to set totalSteps to \(newTotalSteps)")
474+
}
475+
didSet {
476+
if totalSteps > oldValue {
477+
println("Added \(totalSteps - oldValue) steps")
478+
}
479+
}
480+
}
481+
}
482+
```
483+
**Usage:**
484+
```swift
485+
let stepCounter = StepCounter()
486+
stepCounter.totalSteps = 200
487+
// About to set totalSteps to 200
488+
// Added 200 steps
489+
stepCounter.totalSteps = 360
490+
// About to set totalSteps to 360
491+
// Added 160 steps
492+
stepCounter.totalSteps = 896
493+
// About to set totalSteps to 896
494+
// Added 536 steps
495+
```
402496
##🐉 State
403497

404498
```swift

0 commit comments

Comments
 (0)