Skip to content

Commit 89b5d3d

Browse files
committed
added remaining patterns
1 parent 97b7a07 commit 89b5d3d

17 files changed

+805
-1
lines changed

README.md

-1
This file was deleted.

iterator/exercise.swift

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
class Node<T> {
3+
let value: T
4+
var left: Node<T>? = nil
5+
var right: Node<T>? = nil
6+
var parent: Node<T>? = nil
7+
8+
init(_ value: T) {
9+
self.value = value
10+
}
11+
12+
init(_ value: T, _ left: Node<T>, _ right: Node<T>) {
13+
self.value = value
14+
self.left = left
15+
self.right = right
16+
self.left?.parent = self
17+
self.right?.parent = self
18+
}
19+
20+
private func preorder(_ node: Node<T>?) -> [T] {
21+
if let node = node {
22+
var ans = [node.value]
23+
ans += preorder(node.left)
24+
ans += preorder(node.right)
25+
return ans
26+
} else {
27+
return []
28+
}
29+
}
30+
31+
public var preOrder: [T] {
32+
return preorder(self)
33+
}
34+
}

iterator/iterator.swift

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import Foundation
2+
3+
class Node<T> {
4+
var value: T
5+
var left: Node<T>? = nil
6+
var right: Node<T>? = nil
7+
var parent: Node<T>? = nil
8+
9+
init(_ value: T) {
10+
self.value = value
11+
}
12+
13+
init(_ value: T, left: Node<T>, right: Node<T>) {
14+
self.value = value
15+
self.left = left
16+
self.right = right
17+
self.left?.parent = self
18+
self.right?.parent = self
19+
}
20+
}
21+
22+
class Inorderterator<T>: IteratorProtocol {
23+
var current: Node<T>?
24+
var root: Node<T>
25+
var yieldedStart = false
26+
27+
init(_ root: Node<T>) {
28+
self.root = root
29+
self.current = root
30+
while current?.left != nil {
31+
current = current?.left
32+
}
33+
}
34+
35+
func next() -> Node<T>? {
36+
if !yieldedStart {
37+
yieldedStart = true
38+
return current
39+
} else {
40+
if current?.right != nil {
41+
current = current?.right
42+
while current?.left != nil {
43+
current = current?.left
44+
}
45+
return current
46+
} else {
47+
var parent = current?.parent
48+
while parent != nil && current === parent?.right {
49+
current = parent
50+
parent = parent?.parent
51+
}
52+
current = parent
53+
return current
54+
}
55+
}
56+
}
57+
58+
func reset() {
59+
current = root
60+
yieldedStart = false
61+
}
62+
}
63+
64+
let root = Node(1, left: Node(2), right: Node(3))
65+
let iterator = Inorderterator(root)
66+
while let element = iterator.next() {
67+
debugPrint(element.value, terminator: " ")
68+
}

mediator/chatroom.swift

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import Foundation
2+
3+
class Person {
4+
var name: String
5+
var room: ChatRoom? = nil
6+
private var chatLogs = [String]()
7+
8+
init(_ name: String) {
9+
self.name = name
10+
}
11+
12+
func receive(_ sender: String, message: String) {
13+
print("[\(name)'s chat session] \(sender): `\(message)`")
14+
chatLogs.append("\(sender): `\(message)`")
15+
}
16+
17+
func say(_ message: String) {
18+
room?.broadcast(name, message: message)
19+
}
20+
21+
func privateMessage(_ receiver: String, message: String) {
22+
room?.message(name, receiver, message)
23+
}
24+
}
25+
26+
class ChatRoom {
27+
private var people = [Person]()
28+
29+
func broadcast(_ sender: String, message: String) {
30+
for person in people {
31+
if person.name != sender {
32+
person.receive(sender, message: message)
33+
}
34+
}
35+
}
36+
37+
func join(_ person: Person) {
38+
broadcast("admin", message: "\(person.name) joined the chat")
39+
person.room = self
40+
people.append(person)
41+
}
42+
43+
func message(_ sender: String, _ receiver: String, _ message: String) {
44+
people.first(where: { $0.name == receiver })?.receive(sender, message: message)
45+
}
46+
}
47+
48+
let room = ChatRoom()
49+
let john = Person("John")
50+
let doe = Person("Doe")
51+
room.join(john)
52+
room.join(doe)
53+
john.say("Hi!")
54+
doe.say("Hello!")
55+
let martin = Person("Martin")
56+
room.join(martin)
57+
martin.say("Hii!")

mediator/exercise.swift

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Participant {
2+
private let mediator: Mediator
3+
var value = 0
4+
5+
init(_ mediator: Mediator) {
6+
self.mediator = mediator
7+
Mediator.participants.append(self)
8+
}
9+
10+
func say(_ n: Int) {
11+
mediator.broadcast(from: self, n)
12+
}
13+
}
14+
15+
class Mediator {
16+
static var participants = [Participant]()
17+
18+
func broadcast(from participant: Participant, _ value: Int) {
19+
for receiver in type(of: self).participants {
20+
if receiver !== participant {
21+
receiver.value += value
22+
}
23+
}
24+
}
25+
}

memento/bankaccount.swift

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import Foundation
2+
3+
class Memento {
4+
let balance: Int
5+
6+
init(_ balance: Int) {
7+
self.balance = balance
8+
}
9+
}
10+
11+
class BankAccount: CustomStringConvertible {
12+
private var balance: Int
13+
private var changes = [Memento]()
14+
private var current = 0
15+
16+
init(_ balance: Int) {
17+
self.balance = balance
18+
changes.append(Memento(balance))
19+
}
20+
21+
func deposit(_ amount: Int) -> Memento {
22+
balance += amount
23+
let memento = Memento(balance)
24+
changes.append(memento)
25+
current += 1
26+
return memento
27+
}
28+
29+
func restore(_ memento: Memento?) {
30+
if let memento = memento {
31+
balance = memento.balance
32+
changes.append(memento)
33+
current = changes.count - 1
34+
}
35+
}
36+
37+
func undo() -> Memento? {
38+
guard current > 0 else { return nil }
39+
current -= 1
40+
let memento = changes[current]
41+
balance = memento.balance
42+
return memento
43+
}
44+
45+
func redo() -> Memento? {
46+
guard current + 1 < changes.count else { return nil }
47+
current += 1
48+
let memento = changes[current]
49+
balance = memento.balance
50+
return memento
51+
}
52+
53+
var description: String {
54+
return "Balance = \(balance)"
55+
}
56+
}
57+
58+
var account = BankAccount(100)
59+
let m1 = account.deposit(50)
60+
let m2 = account.deposit(25)
61+
//print(account)
62+
//
63+
//// restore
64+
//account.restore(m1)
65+
//print(account)
66+
//
67+
//account.restore(m2)
68+
//print(account)
69+
70+
account.undo()
71+
print("Undo One: \(account)")
72+
73+
account.undo()
74+
print("Undo Two: \(account)")
75+
76+
account.redo()
77+
print("Redo One: \(account)")

memento/exercise.swift

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import Foundation
2+
import XCTest
3+
4+
class Token {
5+
var value = 0
6+
init(_ value: Int) {
7+
self.value = value
8+
}
9+
static func ==(_ lhs: Token, _ rhs: Token) -> Bool {
10+
return lhs.value == rhs.value
11+
}
12+
}
13+
14+
class Memento {
15+
var tokens = [Token]()
16+
}
17+
18+
class TokenMachine {
19+
var tokens = [Token]()
20+
21+
func addToken(_ value: Int) -> Memento {
22+
tokens.append(Token(value))
23+
let memento = Memento()
24+
memento.tokens = tokens
25+
return memento
26+
}
27+
28+
func addToken(_ token: Token) -> Memento {
29+
tokens.append(token)
30+
let memento = Memento()
31+
memento.tokens = tokens
32+
return memento
33+
}
34+
35+
func revert(to memento: Memento) {
36+
self.tokens = memento.tokens
37+
}
38+
}

nullobject/nulllog.swift

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import Foundation
2+
3+
protocol Log {
4+
func info(_ message: String)
5+
func warn(_ message: String)
6+
}
7+
8+
class ConsoleLog: Log {
9+
func info(_ message: String) {
10+
print("Information: \(message)")
11+
}
12+
13+
func warn(_ message: String) {
14+
print("Warning: \(message)")
15+
}
16+
}
17+
18+
class NullLog: Log {
19+
func info(_ message: String) {}
20+
func warn(_ message: String) {}
21+
}
22+
23+
class BankAccount {
24+
var log: Log
25+
var balance = 0
26+
27+
init(_ log: Log) {
28+
self.log = log
29+
}
30+
31+
func deposit(_ amount: Int) {
32+
balance += amount
33+
log.info("Deposited \(amount), Balance \(balance)")
34+
}
35+
}
36+
37+
let log = NullLog()
38+
let account = BankAccount(log)
39+
account.deposit(100)

observer/observer.swift

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import Foundation
2+
3+
protocol Invocalble: AnyObject {
4+
func invoke(_ data: Any)
5+
}
6+
7+
protocol Disposable {
8+
func dispose()
9+
}
10+
11+
class Subscription<T: AnyObject, U>: Invocalble, Disposable {
12+
weak var target: T? = nil
13+
let handler: (T) -> (U) -> ()
14+
let event: Event<U>
15+
16+
init(_ target: T?, handler: @escaping (T) -> (U) -> (), event: Event<U>) {
17+
self.target = target
18+
self.handler = handler
19+
self.event = event
20+
}
21+
22+
func invoke(_ data: Any) {
23+
if let target = target, let data = data as? U {
24+
handler(target)(data)
25+
}
26+
}
27+
28+
func dispose() {
29+
event.eventHandlers = event.eventHandlers.filter {
30+
$0 as AnyObject? !== self
31+
}
32+
}
33+
}
34+
35+
class Event<T> {
36+
typealias EventHandler = (T) -> ()
37+
var eventHandlers = [Invocalble]()
38+
39+
func raise(_ data: T) {
40+
eventHandlers.forEach {
41+
$0.invoke(data)
42+
}
43+
}
44+
45+
func addHandler<U: AnyObject>(
46+
target: U,
47+
handler: @escaping (U) -> EventHandler
48+
) -> Disposable {
49+
return Subscription(target, handler: handler, event: self)
50+
}
51+
}

0 commit comments

Comments
 (0)