Skip to content

Instantly share code, notes, and snippets.

@Sedose
Last active September 14, 2024 09:14
Show Gist options
  • Save Sedose/61afe7be6d6b70a6ac20d1e980707161 to your computer and use it in GitHub Desktop.
Save Sedose/61afe7be6d6b70a6ac20d1e980707161 to your computer and use it in GitHub Desktop.
Delegation pattern using Scala. Zero boilerplate code. Delegate all members | Delegate some of members
trait DatabaseOperations:
def createDatabase(): Unit
def manageDatabase(): Unit
def maintainDatabase(): Unit
class CloudProvider extends DatabaseOperations:
def createDatabase(): Unit =
println("Cloud Provider creates the database.")
def manageDatabase(): Unit =
println("Cloud Provider manages the database.")
def maintainDatabase(): Unit =
println("Cloud Provider maintains the database.")
// ITEngineer class delegates DatabaseOperations to CloudProvider
class ITEngineer(cloudProvider: CloudProvider) extends DatabaseOperations:
export cloudProvider.* // Delegate all methods from CloudProvider
def focusOnBusinessLogic(): Unit =
println("Engineer focuses on business logic and data modeling.")
@main def runDelegationExample(): Unit =
val cloudProvider = new CloudProvider
val engineer = new ITEngineer(cloudProvider)
// Engineer delegates database tasks to the Cloud Provider
engineer.createDatabase()
engineer.manageDatabase()
engineer.maintainDatabase()
// And then Engineer does his main job
engineer.focusOnBusinessLogic()
trait DatabaseOperations:
def createDatabase(): Unit
def manageDatabase(): Unit
def maintainDatabase(): Unit
class CloudProvider extends DatabaseOperations:
def createDatabase(): Unit =
println("Cloud Provider creates the database.")
def manageDatabase(): Unit =
println("Cloud Provider manages the database.")
def maintainDatabase(): Unit =
println("Cloud Provider maintains the database.")
// ITEngineer class delegates DatabaseOperations to CloudProvider
class ITEngineer(cloudProvider: CloudProvider):
export cloudProvider.manageDatabase // Delegate only one method from CloudProvider
def focusOnBusinessLogic(): Unit =
println("Engineer focuses on business logic and data modeling.")
@main def runDelegationExample(): Unit =
val cloudProvider = new CloudProvider
val engineer = new ITEngineer(cloudProvider)
// Engineer delegates database tasks to the Cloud Provider
engineer.createDatabase() // compile error cause createDatabase is not delegated
engineer.manageDatabase()
engineer.maintainDatabase() // compile error cause maintainDatabase is not delegated
// And Engineer does his main job
engineer.focusOnBusinessLogic()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment