Created
December 21, 2016 03:35
-
-
Save dkilmer/382d41caafcae0c8f49a29e80327eeba to your computer and use it in GitHub Desktop.
An object-oriented birthday card
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
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