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
14 changes: 1 addition & 13 deletions app/src/main/java/com/example/algorithmstudy/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,24 +1,12 @@
package com.example.algorithmstudy

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.algorithmstudy.pattern.creation.builder.MailBuilder
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

buildMail()
}

private fun buildMail() {
MailBuilder("Bill gates")
.title("Hi bill!")
.build().also {
Log.d("patternTest", "Mail was built : $it")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.example.algorithmstudy.pattern.behavoiral.iterator

data class Food(val name: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.algorithmstudy.pattern.behavoiral.iterator

class FoodIterator(private val collection: List<Food>) : Iterator<Food> {
private var index = 0

override fun next(): Food {
return collection[index++]
}

override fun hasNext(): Boolean {
return index < collection.size
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.algorithmstudy.pattern.behavoiral.iterator

interface Iterator<T : Any> {
fun next(): T
fun hasNext(): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.algorithmstudy.pattern.behavoiral.memento

/**
* caretaker : the object that keeps track of multiple memento. Like maintaining save points.
*/
class CareTaker {
private val stateList = mutableListOf<Memento>()

fun addMemento(memento: Memento) {
stateList.add(memento)
}

fun getMemento(index: Int): Memento {
return stateList[index]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.algorithmstudy.pattern.behavoiral.memento

/**
* 기억하고자 하는 어느 클래스와도 사용 가능하도록 하는 GenericCareTaker
*/
class GenericCareTaker<T : Any> {
private val stateList = mutableListOf<T>()

fun addMemento(memento: T) {
stateList.add(memento)
}

fun getMemento(index: Int): T {
return stateList[index]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.algorithmstudy.pattern.behavoiral.memento

/**
* 기억하고자 하는 어느 클래스와도 사용 가능하도록 하는 GenericOriginator
*/
class GenericOriginator<T : Any> {
var state: T? = null

fun createMemento(): T {
return state!!
}

fun setMemento(memento: T) {
state = memento
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.algorithmstudy.pattern.behavoiral.memento

/**
* memento : the object that is going to maintain the state of the originator. It is just a POJO.
*/
data class Memento(val state: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.example.algorithmstudy.pattern.behavoiral.memento

/**
* Generic 타입을 사용함과 동시에 패턴의 취지를 유지하며, 사용 방식을 보다 일원화 하도록 하는 Manager object
*/
object MementoManager {
private val originator = GenericOriginator<Memento>()
private val careTaker = GenericCareTaker<Memento>()

// state를 설정함과 동시에 Memento를 생성, careTaker에 추가
fun setState(memento: Memento) {
originator.state = memento
careTaker.addMemento(originator.createMemento())
}

fun getState(index: Int): Memento {
return careTaker.getMemento(index)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.algorithmstudy.pattern.behavoiral.memento

/**
* originator : the object for which the state is to be saved. It creates the memento and uses it in the future to undo.
*/
class Originator {

var state: String? = null

fun createMemento(): Memento {
return Memento(state ?: "")
}

fun setMemento(memento: Memento) {
state = memento.state
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.example.algorithmstudy.pattern.behavoiral.strategy

abstract class Damage(val amount: Int, val criticalHit: Double)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.algorithmstudy.pattern.behavoiral.strategy

class Fireball : Skill {
override fun perform(target: Int): Damage = object : Damage(2000, 0.2) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.algorithmstudy.pattern.behavoiral.strategy

class Player {
fun attackWithSkill(skill: Skill, target: Int) {
skill.perform(target)

println("$skill attack! to $target")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.algorithmstudy.pattern.behavoiral.strategy

interface Skill {
fun perform(target: Int): Damage
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.algorithmstudy.pattern.behavoiral.strategy

class ThunderStorm : Skill {
override fun perform(target: Int): Damage = object : Damage(1000, 0.3) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.example.algorithmstudy.design_pattern

import com.example.algorithmstudy.pattern.behavoiral.iterator.Food
import com.example.algorithmstudy.pattern.behavoiral.iterator.FoodIterator
import com.example.algorithmstudy.pattern.behavoiral.strategy.Fireball
import com.example.algorithmstudy.pattern.behavoiral.strategy.Player
import com.example.algorithmstudy.pattern.behavoiral.strategy.ThunderStorm
import org.junit.Test

/**
* Iterator Pattern
*/
class IteratorTest {

@Test
fun testIterator() {
val foodCollection = mutableListOf(Food("Apple"), Food("Banana"), Food("Kiwi"))
val iterator = FoodIterator(foodCollection)

while (iterator.hasNext()) {
println(iterator.next())
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.example.algorithmstudy.design_pattern

import com.example.algorithmstudy.pattern.behavoiral.memento.*
import org.junit.Test

/**
* @reference: https://chercher.tech/kotlin/momento-design-pattern-kotlin
*/
class MementoTest {

@Test
fun testMemento() {
val originator = Originator()
originator.state = "Ironman"
var memento = originator.createMemento()
val careTaker = CareTaker()
careTaker.addMemento(memento)

originator.state = "Captain America"
originator.state = "Hulk"
memento = originator.createMemento()
careTaker.addMemento(memento)
originator.state = "Thor"
println("Originator Current State: " + originator.state!!)
println("Originator restoring to previous state...")
memento = careTaker.getMemento(1)
originator.setMemento(memento)
println("Originator Current State: " + originator.state!!)
println("Again restoring to previous state...")
memento = careTaker.getMemento(0)
originator.setMemento(memento)
println("Originator Current State: " + originator.state!!)
}

@Test
fun testGeneric() {
val originator = GenericOriginator<Memento>()
originator.state = Memento("Ironman")
var memento = originator.createMemento()
val careTaker = GenericCareTaker<Memento>()
careTaker.addMemento(memento)

originator.state = Memento("Captain America")
originator.state = Memento("Hulk")
memento = originator.createMemento()
careTaker.addMemento(memento)
originator.state = Memento("Thor")

println("Originator Current State: " + originator.state!!)
println("Originator restoring to previous state...")
memento = careTaker.getMemento(1)
originator.setMemento(memento)
println("Originator Current State: " + originator.state!!)
println("Again restoring to previous state...")
memento = careTaker.getMemento(0)
originator.setMemento(memento)
println("Originator Current State: " + originator.state!!)
}

@Test
fun testMananger() {
MementoManager.setState(Memento("Ironman"))
MementoManager.setState(Memento("Captain America"))
MementoManager.setState(Memento("Hulk"))

println(MementoManager.getState(2))
println(MementoManager.getState(1))
println(MementoManager.getState(0))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.algorithmstudy.design_pattern

import com.example.algorithmstudy.pattern.behavoiral.strategy.Fireball
import com.example.algorithmstudy.pattern.behavoiral.strategy.Player
import com.example.algorithmstudy.pattern.behavoiral.strategy.ThunderStorm
import org.junit.Test

/**
* Strategy Pattern
*/
class StrategyTest {

@Test
fun testStrategy() {
val player = Player()

player.attackWithSkill(ThunderStorm(), 2)
player.attackWithSkill(Fireball(), 1)
}
}