Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.algorithmstudy.pattern.structure.proxy

interface ProtectedProxyInterface {
fun fetch(user: User): ProxyData
}
Original file line number Diff line number Diff line change
@@ -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.")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.example.algorithmstudy.pattern.structure.proxy

data class ProxyData(val data: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.algorithmstudy.pattern.structure.proxy

interface ProxyLoaderInterface {
fun fetch(): ProxyData
}
Original file line number Diff line number Diff line change
@@ -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
}
}
Original file line number Diff line number Diff line change
@@ -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
}
}
Original file line number Diff line number Diff line change
@@ -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())
}
}
}