Skip to content

Instantly share code, notes, and snippets.

@dkilmer
Created December 21, 2016 03:35
Show Gist options
  • Save dkilmer/382d41caafcae0c8f49a29e80327eeba to your computer and use it in GitHub Desktop.
Save dkilmer/382d41caafcae0c8f49a29e80327eeba to your computer and use it in GitHub Desktop.
An object-oriented birthday card
import java.util.*
object Birthday {
class BirthdayDependencyInjector {
fun injectDependencyIntoTheFactory(dataProvider: GreetingCardDataProvider<Date>) : BirthdayCardProvider {
return BirthdayCardProvider(dataProvider)
}
}
abstract class AbstractBaseGreetingCardProviderFactory<R, out T:AbstractBaseGreetingCardProvider> {
abstract fun getInstance(dataProvider: GreetingCardDataProvider<R>) : T
}
abstract class AbstractBaseGreetingCardProvider {
abstract fun provideCard(name: String, msg: String, listener: GreetingCardMessageListener)
}
interface GreetingCardDataProvider<T> {
fun getGreetingCardData(key: String) : T
}
interface GreetingCardMessageListener {
fun receiveCardMessage(name: String, msg: String, date: Date)
}
class BirthdayCardDataProvider(val bday: Date) : GreetingCardDataProvider<Date> {
override fun getGreetingCardData(key: String) : Date {
return when (key) {
"today" -> Date()
"birthday" -> bday
else -> Date()
}
}
}
class BirthdayCardProviderFactory : AbstractBaseGreetingCardProviderFactory<Date,BirthdayCardProvider>() {
override fun getInstance(dataProvider: GreetingCardDataProvider<Date>) : BirthdayCardProvider {
return BirthdayDependencyInjector().injectDependencyIntoTheFactory(dataProvider)
}
}
class BirthdayCardProvider(val dataProvider: GreetingCardDataProvider<Date>) : AbstractBaseGreetingCardProvider() {
override fun provideCard(name: String, msg: String, listener: GreetingCardMessageListener) {
listener.receiveCardMessage(name, msg, dataProvider.getGreetingCardData("birthday"))
}
}
class BirthdayCardMessageListener : GreetingCardMessageListener {
override fun receiveCardMessage(name: String, msg: String, date: Date) {
println("Happy Birthday, $name! Your birthday is $date")
if (msg.isNotEmpty()) {
println("I have an additional message for you:")
println(msg)
}
}
}
@JvmStatic
fun main(args: Array<String>) {
BirthdayCardProviderFactory()
.getInstance(BirthdayCardDataProvider(Date()))
.provideCard("James", "May all your code run smoothly", BirthdayCardMessageListener())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment