Skip to content

Commit 874aed1

Browse files
Behavioral Done
1 parent bd0ee4c commit 874aed1

4 files changed

+352
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import Foundation
2+
3+
protocol Invocable : class
4+
{
5+
func invoke(_ data: Any)
6+
}
7+
8+
public protocol Disposable
9+
{
10+
func dispose()
11+
}
12+
13+
public class Event<T>
14+
{
15+
public typealias EventHandler = (T) -> ()
16+
17+
var eventHandlers = [Invocable]()
18+
19+
public func raise(_ data: T)
20+
{
21+
for handler in eventHandlers
22+
{
23+
handler.invoke(data)
24+
}
25+
}
26+
27+
public func addHandler<U: AnyObject>
28+
(target: U, handler: @escaping (U) -> EventHandler) -> Disposable
29+
{
30+
let subscription = Subscription(
31+
target: target, handler: handler, event: self)
32+
eventHandlers.append(subscription)
33+
return subscription
34+
}
35+
}
36+
37+
class Subscription<T: AnyObject, U> : Invocable, Disposable
38+
{
39+
weak var target: T? // note: weak reference!
40+
let handler: (T) -> (U) -> ()
41+
let event: Event<U>
42+
43+
init(target: T?,
44+
handler: @escaping (T) -> (U) -> (),
45+
event: Event<U>)
46+
{
47+
self.target = target
48+
self.handler = handler
49+
self.event = event
50+
}
51+
52+
func invoke(_ data: Any) {
53+
if let t = target {
54+
handler(t)(data as! U)
55+
}
56+
}
57+
58+
func dispose()
59+
{
60+
event.eventHandlers = event.eventHandlers.filter { $0 as AnyObject? !== self }
61+
}
62+
}
63+
64+
class ScoreBoardInTheGround{
65+
let batsmenHitRun = Event<Int>()
66+
init(){}
67+
func updateScore(){
68+
69+
}
70+
}
71+
72+
class ScoreUpdateInServers{
73+
init(){
74+
let scoreBoard = ScoreBoardInTheGround()
75+
let subscriber = scoreBoard.batsmenHitRun.addHandler(target: self, handler: ScoreUpdateInServers.showScoreInApp)
76+
77+
//simualte batsman hitting runs in the ground
78+
scoreBoard.batsmenHitRun.raise(6)
79+
80+
//get rid of the description
81+
subscriber.dispose()
82+
}
83+
84+
func showScoreInApp(score: Int){
85+
print("Score Now is : \(score) runs")
86+
}
87+
}
88+
89+
func main(){
90+
let dummy = ScoreUpdateInServers()
91+
}
92+
93+
main()
94+
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import UIKit
2+
3+
protocol State {
4+
func isSold(playerAuction: PlayerAuction) -> Bool
5+
func whichTeam(playerAuction: PlayerAuction) -> String?
6+
}
7+
8+
class PlayerAuction {
9+
private var state: State = IsUnsoldState()
10+
11+
var isSold: Bool {
12+
get {
13+
return state.isSold(playerAuction: self)
14+
}
15+
}
16+
17+
var teamName: String? {
18+
get {
19+
return state.whichTeam(playerAuction: self)
20+
}
21+
}
22+
23+
func changeStateToSold(teamName: String) {
24+
state = IsSoldState(teamName: teamName)
25+
26+
}
27+
28+
func changeStateToUnSold() {
29+
state = IsUnsoldState()
30+
}
31+
32+
}
33+
34+
35+
36+
class IsUnsoldState: State {
37+
func isSold(playerAuction: PlayerAuction) -> Bool { return false }
38+
39+
func whichTeam(playerAuction: PlayerAuction) -> String? { return nil }
40+
}
41+
42+
class IsSoldState: State {
43+
let teamName: String
44+
45+
init(teamName: String) {
46+
self.teamName = teamName
47+
}
48+
49+
func isSold(playerAuction: PlayerAuction) -> Bool {
50+
return true
51+
}
52+
53+
func whichTeam(playerAuction: PlayerAuction) -> String? {
54+
return teamName
55+
}
56+
}
57+
58+
func main(){
59+
let playerAuction = PlayerAuction()
60+
print(playerAuction.isSold, playerAuction.teamName)
61+
playerAuction.changeStateToSold(teamName: "Chennai Super Kings")
62+
print(playerAuction.isSold, playerAuction.teamName!)
63+
}
64+
65+
main()
66+
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import UIKit
2+
import Foundation
3+
4+
class TeamTemplate{
5+
func buildTeam(){
6+
pickBatsmen()
7+
pickBowlers()
8+
pickAllRounders()
9+
pickWicketKeeper()
10+
print("\nTeam Set For the match")
11+
}
12+
13+
func pickBatsmen(){
14+
15+
}
16+
17+
func pickBowlers(){
18+
19+
}
20+
21+
func pickAllRounders(){
22+
23+
}
24+
25+
private func pickWicketKeeper(){
26+
print("Only one WK avaialable and he is picked by default")
27+
}
28+
}
29+
30+
class SeamingPitchTeamTemplate : TeamTemplate{
31+
override func pickBatsmen() {
32+
print("Picking 6 batsmen")
33+
}
34+
35+
override func pickBowlers() {
36+
print("Picking 3 Fast Bowlers")
37+
}
38+
39+
override func pickAllRounders() {
40+
print("Picking 1 Pace AllRounder")
41+
}
42+
}
43+
44+
class SpinPitchTeamTemplate : TeamTemplate{
45+
override func pickBatsmen() {
46+
print("Picking 5 Batsmen")
47+
}
48+
49+
override func pickBowlers() {
50+
print("Picking 2 Fast Bowlers and 2 Spinners")
51+
}
52+
53+
override func pickAllRounders() {
54+
print("Picking 2 Spin AllRounder")
55+
}
56+
}
57+
58+
class BattingPitchTeamTemplate : TeamTemplate{
59+
override func pickBatsmen() {
60+
print("Picking 7 Batsmen")
61+
}
62+
63+
override func pickBowlers() {
64+
print("Picking 2 Fast Bowlers and 1 Spinners")
65+
}
66+
67+
override func pickAllRounders() {
68+
print("Picking 1 Batting AllRounder")
69+
}
70+
}
71+
72+
func main(){
73+
var finalTeam : TeamTemplate = SeamingPitchTeamTemplate()
74+
finalTeam.buildTeam()
75+
76+
print("\n***Pitch Changed***\n")
77+
finalTeam = SpinPitchTeamTemplate()
78+
finalTeam.buildTeam()
79+
80+
print("\n***Pitch Changed***\n")
81+
finalTeam = BattingPitchTeamTemplate()
82+
finalTeam.buildTeam()
83+
}
84+
85+
main()
86+
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import Foundation
2+
import UIKit
3+
4+
protocol CricketAccessory{
5+
func accept(counter : CheckoutCounter) -> Int
6+
}
7+
8+
class CricketBat : CricketAccessory{
9+
private var price : Double
10+
private var brand : String
11+
12+
init(_ price : Double, _ brand:String) {
13+
self.price = price
14+
self.brand = brand
15+
}
16+
17+
public func getPrice() -> Double{
18+
return price
19+
}
20+
21+
public func getBrand() -> String{
22+
return brand
23+
}
24+
func accept(counter : CheckoutCounter) -> Int {
25+
return counter.moveToCounter(bat: self)
26+
}
27+
}
28+
29+
class CricketBall : CricketAccessory{
30+
31+
private var type : String
32+
private var price : Double
33+
34+
init(_ type : String, _ price : Double){
35+
self.type = type
36+
self.price = price
37+
38+
}
39+
40+
public func getType() -> String{
41+
return type
42+
}
43+
44+
public func getPrice() -> Double{
45+
return price
46+
}
47+
48+
func accept(counter : CheckoutCounter) -> Int {
49+
return counter.moveToCounter(ball: self)
50+
}
51+
52+
}
53+
54+
protocol CheckoutCounter {
55+
func moveToCounter(bat : CricketBat) -> Int
56+
func moveToCounter(ball : CricketBall) -> Int
57+
}
58+
59+
class CashCounter :CheckoutCounter{
60+
func moveToCounter(bat: CricketBat) -> Int {
61+
var cost : Int = 0
62+
if bat.getBrand() == "Brittania"{
63+
cost = Int(0.8 * bat.getPrice())
64+
} else{
65+
cost = Int(bat.getPrice())
66+
}
67+
print("Bat brand : \(bat.getBrand()) and price is : \(cost) ")
68+
return cost
69+
}
70+
71+
func moveToCounter(ball: CricketBall) -> Int {
72+
73+
print("Ball Type : \(ball.getType()) and price is : \(ball.getPrice()) ")
74+
return Int(ball.getPrice())
75+
}
76+
}
77+
78+
79+
func main(){
80+
print("Main")
81+
func finalPriceCalculation(accessories : [CricketAccessory]) -> Int{
82+
var checkout = CashCounter()
83+
var cost = 0
84+
for item in accessories{
85+
cost += item.accept(counter: checkout)
86+
}
87+
print("Toal cart value : \(cost)")
88+
return cost
89+
}
90+
91+
var cartItems = [CricketAccessory]()
92+
let mrfBat = CricketBat(2000, "MRF")
93+
let brittaniaBat = CricketBat(1500, "Brittania")
94+
let tennisBall = CricketBall("Tennis", 120)
95+
let leatherBall = CricketBall("Leather", 200)
96+
cartItems.append(mrfBat)
97+
cartItems.append(brittaniaBat)
98+
cartItems.append(tennisBall)
99+
cartItems.append(leatherBall)
100+
101+
var cost = finalPriceCalculation(accessories: cartItems)
102+
print("Checked Out with Bill Amount : \(cost)")
103+
}
104+
105+
main()
106+

0 commit comments

Comments
 (0)