Sam Edwards - @HandstandSam - Square
Interception
Droidcon NYC
September 14, 2023
#DCNYC23
Slide 2
Slide 2 text
A
Call
B
Completion
Invocation
Slide 3
Slide 3 text
A
Call Chain
B
Slide 4
Slide 4 text
A
Call Chain
B
Slide 5
Slide 5 text
Call Chain
A B
Slide 6
Slide 6 text
Call Chain with Interceptors
A B
Slide 7
Slide 7 text
Telephone Game ☎
A B
Slide 8
Slide 8 text
Interceptor Pattern 💻
Slide 9
Slide 9 text
https://en.wikipedia.org/wiki/Interceptor_pattern
Offer a way to change, or augment the
usual processing cycle.
Interceptor Pattern
Slide 10
Slide 10 text
https://en.wikipedia.org/wiki/Interceptor_pattern
The rest of the system does not have to
know something has been added or
changed and can keep working as before.
Interceptor Pattern
Interfaces Enable Injection
interface Logger {
fun log(message: String)
}
Slide 50
Slide 50 text
Interfaces Enable Injection
interface Logger {
fun log(message: String)
}
class SystemOutLogger : Logger {
override fun log(message: String) {
println(message)
}
}
Slide 51
Slide 51 text
Interfaces Enable Injection
interface Logger {
fun log(message: String)
}
class SystemOutLogger : Logger {
override fun log(message: String) {
println(message)
}
}
class AndroidLogger : Logger {
override fun log(message: String) {
Log.d("Logger", message)
}
}
Slide 52
Slide 52 text
Interfaces Enable Interception
Slide 53
Slide 53 text
A
Interfaces Enable Interception
B
SystemOutLogger
Logger
Slide 54
Slide 54 text
A
Interfaces Enable Interception
B
Logger SystemOutLogger
Logger
Slide 55
Slide 55 text
A
Interfaces Enable Interception
B
Logger SystemOutLogger
Logger Logger
Slide 56
Slide 56 text
Interfaces Enable Interception
A B
Logger SystemOutLogger
Logger Logger Logger
Slide 57
Slide 57 text
Interfaces Enable Fakes
Slide 58
Slide 58 text
A
Interfaces Enable Fakes
B
Interface 3rd Party Lib
Fake
Slide 59
Slide 59 text
Kotlin Delegates
Slide 60
Slide 60 text
Kotlin Delegates
Passthrough
class PassthroughDelegateLogger(
private val delegate: Logger
)
:
Logger {
override fun log(message: String) {
delegate.log(message)
}
override fun error(message: String) {
delegate.error(message)
}
}
Slide 61
Slide 61 text
Kotlin Delegates
Logging
class LoggingDelegateLogger(
private val delegate: Logger
)
:
Logger by delegate {
override fun log(message: String) {
println("Logged $message")
delegate.log(message)
}
}
Slide 62
Slide 62 text
Kotlin Delegates
Modifying
class AddTimestampLogger(
private val delegate: Logger
)
:
Logger by delegate {
override fun log(message: String) {
delegate.log("${Date()} $message")
}
}
Slide 63
Slide 63 text
Kotlin Delegates
Short Circuit
class ShortCircuitNoErrorsDelegateLogger(
private val delegate: Logger
)
:
Logger by delegate {
override fun log(message: String) {
delegate.log("${Date()} $message")
}
override fun error(message: String) {
// Do Not Delegate
}
}