Last active
September 14, 2024 09:14
-
-
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
This file contains 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
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() |
This file contains 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
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