Skip to content

Instantly share code, notes, and snippets.

@num8er
Last active April 5, 2025 01:35
Show Gist options
  • Save num8er/8bc45744de7ceb260105008d189bb0c5 to your computer and use it in GitHub Desktop.
Save num8er/8bc45744de7ceb260105008d189bb0c5 to your computer and use it in GitHub Desktop.
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