Last active
April 5, 2025 01:35
-
-
Save num8er/8bc45744de7ceb260105008d189bb0c5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
protocol Engine { | |
func start() | |
func started() -> Bool | |
func stop() | |
} | |
class GasEngine: Engine { | |
private var running: Bool | |
init() { | |
self.running = false | |
} | |
func start() { | |
if self.started() { | |
return | |
} | |
print("Gas engine starting...") | |
self.running = true | |
} | |
func started() -> Bool { | |
return self.running | |
} | |
func stop() { | |
self.running = false | |
} | |
} | |
class ElectricEngine: Engine { | |
private var running: Bool | |
init() { | |
self.running = false | |
} | |
func start() { | |
if self.started() { | |
return | |
} | |
print("Electric engine starting...") | |
self.running = true | |
} | |
func started() -> Bool { | |
return self.running | |
} | |
func stop() { | |
self.running = false | |
} | |
} | |
class HybridEngine: Engine { | |
var primaryEngine: Engine | |
var secondaryEngine: Engine | |
var activeEngine: Engine | |
init(pEngine: Engine, sEngine: Engine) { | |
self.primaryEngine = pEngine | |
self.secondaryEngine = sEngine | |
self.activeEngine = self.primaryEngine | |
} | |
// this method is for private use to switch engine by internal logic | |
private func switchEngine() { | |
if activeEngine === primaryEngine { | |
activeEngine = secondaryEngine | |
} else { | |
activeEngine = primaryEngine | |
} | |
print("Switched engine.") | |
} | |
// internal logic of working engine | |
private func loop() { | |
// based on some logic can switch engine | |
self.switchEngine() | |
} | |
func start() { | |
activeEngine.start() | |
} | |
func started() -> Bool { | |
return activeEngine.started() | |
} | |
func stop() { | |
activeEngine.stop() | |
} | |
} | |
class Car { | |
private engine: Engine | |
func init(engine: Engine) { | |
self.engine = engine | |
} | |
func startCar() { | |
self.engine.start() | |
} | |
} | |
let hybridEngine = HybridEngine( | |
GasEngine(), | |
ElectricEngine() | |
) | |
let hybridCar = Car(hybridEngine) | |
hybridCar.startCar() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment