yepdi / TIL

Today I Learn
0 stars 0 forks source link

Design Pattern - Command, Strategy 패턴 #5

Open yepdi opened 2 years ago

yepdi commented 2 years ago

Design Pattern

Command 패턴

예제 코드

interface Command {
    fun executable(event): Boolean
    fun execute(event): Result
    companion object {
        fun allCommandsOf() = listOf(
             OnCommand()
             OffCommand()
        )
    }
}

internal class OnCommand(): Command {
    fun executable(event): Boolean = (event.type == "On")
    fun execute(event): Result {
    .... // 구현내용 생략
    }
}

internal class OffCommand(): Command {
    fun executable(event): Boolean = (event.type == "Off")
    fun execute(event): Result {
    .... // 구현내용 생략
    }
}

class ClientImpl() {
   val commands = Command.allCommandsOf() // 커멘드들의 리스트를 담는 것
    fun executeCommand(event: String) {
       // 커멘드 수행. executable에서 만족되는 것 수행 
        commands.find {it.executable(event)}?.execute(event)
    }
}

Strategy 패턴

예제코드

interface Strategy {
    fun execute(event): result
}

internal class OnStrategy(): Strategy {
   fun execute(event): result {
     // 구현 내용 생략
   }
}

internal class OffStrategy(): Strategy {
   fun execute(event): result {
     // 구현 내용 생략
   }
}

class EventHandling() {
   private lateinit var strategy: Strategy

  fun setStrategy(strategy: Strategy) {
         this.strategy = strategy
  }

  fun logic() {
    // 구현 내용 생략
   ....
    strategy.execute(event)
    ...
  }
}

class ClientImpl() {
  private val eventHandler = EventHandling()
  fun executor() {
        eventHandler.setStrategy(new OnStrategy())
        eventHandler.logic()

        eventHandler.setStrategy(new OffStrategy())
        eventHandler.logic()
   }
}

Strategy 패턴은 EventHandling 함수에서 하나만 Strategy로 받도록 되었는데 경우에 따라선 Command 패턴 예제처럼 사용할 수도 있다(둘다 같은 Behavior 패턴에 속하니까..) 중요한 것은 목적이 어떤 것인지 파악하는 것이 중요해보인다

출처 : https://kimchanjung.github.io/design-pattern/2020/05/28/strategy-pattern/ https://tecoble.techcourse.co.kr/post/2021-10-04-strategy-command-pattern/