An example of a remote proxy pattern in Kotlin.
Table of contents for design patterns in Kotlin
A remote proxy provides a local object that references a subject object in another location, generally via a network connection. Wikipedia blackwasp.co.uk
Example:
ReportGenerator
import java.rmi.Remote
import java.rmi.RemoteException
interface ReportGenerator: Remote {
@Throws(RemoteException::class)
fun generateReport(): String
}
ReportService
import java.rmi.server.UnicastRemoteObject
import java.util.Date
class ReportService : UnicastRemoteObject(), ReportGenerator {
override fun generateReport(): String = """
Report
date: ${Date()} ${System.currentTimeMillis()}
""".trimIndent()
companion object {
private const val serialVersionUID = -104899L
}
}
ReportRemoteProxy
import java.rmi.Naming
class ReportRemoteProxy(rmi: String) : ReportGenerator {
private val reportGenerator: ReportGenerator = Naming.lookup(rmi) as ReportGenerator
override fun generateReport(): String = reportGenerator.generateReport()
}
Usage:
fun main() {
val reportGeneratorService: ReportGenerator = ReportService()
requestReport("Local report call", reportGeneratorService)
LocateRegistry.createRegistry(1099)
Naming.rebind("rmi://localhost:1099/ABC", reportGeneratorService)
val reportGeneratorProxy = ReportRemoteProxy("rmi://localhost:1099/ABC")
requestReport("Remote report call", reportGeneratorProxy)
}
fun requestReport(name: String, reportGenerator: ReportGenerator) {
println(name)
println(reportGenerator.generateReport())
println()
}
Result
Local report call
Report
date: Sun Aug 16 21:35:18 NOVT 2020 1597588518502
Remote report call
Report
date: Sun Aug 16 21:35:18 NOVT 2020 1597588518612