diff --git a/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProtectedProxyInterface.kt b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProtectedProxyInterface.kt new file mode 100644 index 0000000..6ff8dd7 --- /dev/null +++ b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProtectedProxyInterface.kt @@ -0,0 +1,5 @@ +package com.example.algorithmstudy.pattern.structure.proxy + +interface ProtectedProxyInterface { + fun fetch(user: User): ProxyData +} diff --git a/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProtectedProxyLoader.kt b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProtectedProxyLoader.kt new file mode 100644 index 0000000..9bc448f --- /dev/null +++ b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProtectedProxyLoader.kt @@ -0,0 +1,16 @@ +package com.example.algorithmstudy.pattern.structure.proxy + +class ProtectedProxyLoader : ProtectedProxyInterface { + private val proxyData: ProxyData by lazy { + ProxyData("PROXY DATA") + } + + // fetch 가능한 수준을 MEDIUM 이상으로 설정 + override fun fetch(user: User): ProxyData { + return when (user.authorizeLevel) { + User.AuthorizeLevel.TOP -> proxyData + User.AuthorizeLevel.MEDIUM -> proxyData + User.AuthorizeLevel.LOW -> throw IllegalAccessException("Unauthorized access.") + } + } +} diff --git a/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProxyData.kt b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProxyData.kt new file mode 100644 index 0000000..d57be70 --- /dev/null +++ b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProxyData.kt @@ -0,0 +1,3 @@ +package com.example.algorithmstudy.pattern.structure.proxy + +data class ProxyData(val data: String) diff --git a/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProxyLoaderInterface.kt b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProxyLoaderInterface.kt new file mode 100644 index 0000000..a316d63 --- /dev/null +++ b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/ProxyLoaderInterface.kt @@ -0,0 +1,5 @@ +package com.example.algorithmstudy.pattern.structure.proxy + +interface ProxyLoaderInterface { + fun fetch(): ProxyData +} diff --git a/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/User.kt b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/User.kt new file mode 100644 index 0000000..8077586 --- /dev/null +++ b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/User.kt @@ -0,0 +1,15 @@ +package com.example.algorithmstudy.pattern.structure.proxy + +/** + * 권한설정이 추가되어 있는 user를 가정한 data class + */ +data class User( + val name: String, + var authorizeLevel: AuthorizeLevel +) { + enum class AuthorizeLevel { + TOP, + MEDIUM, + LOW + } +} diff --git a/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/VirtualProxyLoader.kt b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/VirtualProxyLoader.kt new file mode 100644 index 0000000..c6a52ad --- /dev/null +++ b/app/src/main/java/com/example/algorithmstudy/pattern/structure/proxy/VirtualProxyLoader.kt @@ -0,0 +1,11 @@ +package com.example.algorithmstudy.pattern.structure.proxy + +class VirtualProxyLoader : ProxyLoaderInterface { + private val proxyData: ProxyData by lazy { + ProxyData("PROXY DATA") + } + + override fun fetch(): ProxyData { + return proxyData + } +} diff --git a/app/src/test/java/com/example/algorithmstudy/design_pattern/ProxyTest.kt b/app/src/test/java/com/example/algorithmstudy/design_pattern/ProxyTest.kt new file mode 100644 index 0000000..63aa8d9 --- /dev/null +++ b/app/src/test/java/com/example/algorithmstudy/design_pattern/ProxyTest.kt @@ -0,0 +1,44 @@ +package com.example.algorithmstudy.design_pattern + +import com.example.algorithmstudy.pattern.structure.proxy.ProtectedProxyLoader +import com.example.algorithmstudy.pattern.structure.proxy.User +import com.example.algorithmstudy.pattern.structure.proxy.VirtualProxyLoader +import org.junit.Test + +/** + * ProxyTest Pattern + * + * - Virtual proxy : 사용하는 객체가 이미 생성된 경우 재사용하는 패턴 + * - Protected proxy : 권한에 따라 객체 접근을 제어하는 패턴 + */ +class ProxyTest { + + @Test + fun testVirtualProxy() { + val proxyLoader = VirtualProxyLoader() + + println(proxyLoader.fetch()) + println(proxyLoader.fetch()) + println(proxyLoader.fetch() === proxyLoader.fetch()) + } + + @Test + fun testProtectedProxy() { + val member = User(name = "choi", authorizeLevel = User.AuthorizeLevel.MEDIUM) + val guest = User(name = "steve", authorizeLevel = User.AuthorizeLevel.LOW) + + val proxyLoader = ProtectedProxyLoader() + + try { + println(proxyLoader.fetch(member)) + } catch (e: IllegalAccessException) { + println(e.printStackTrace()) + } + + try { + println(proxyLoader.fetch(guest)) + } catch (e: IllegalAccessException) { + println(e.printStackTrace()) + } + } +}