λμμΈ ν¨ν΄ μ€ νλμΈ μ»€λ§¨λ ν¨ν΄μ μμ²μ κ°μ²΄λ‘ μΊ‘μννμ¬ μλ‘ λ€λ₯Έ μμ²μ κ°μ²΄λ‘ λ€λ£° μ μκ² ν΄μ€λλ€!
μ΄λ²μλ Swiftμμ 컀맨λ ν¨ν΄μ ꡬννλ λ°©λ²μ μμλ³΄κ² μ΅λλ€.
컀맨λ ν¨ν΄μ΄λ?
컀맨λ ν¨ν΄μ μ€νλ κΈ°λ₯μ μΊ‘μννμ¬ ν΄λΌμ΄μΈνΈμ μ€ν κ°μ²΄λ₯Ό λΆλ¦¬νλ ν¨ν΄μ λλ€. μ΄λ₯Ό ν΅ν΄ λͺ λ Ήμ 맀κ°λ³μννκ³ , μμ²μ νμ μ μ₯νκ±°λ λ‘κΉ νλ©°, μ€ν μ·¨μ κΈ°λ₯μ μ½κ² ꡬνν μ μμ΅λλ€.
컀맨λ ν¨ν΄μ κ΅¬μ± μμ
1. Command νλ‘ν μ½: μ€νλ λͺ λ Ήμ μΈν°νμ΄μ€λ₯Ό μ μν©λλ€.
2. Concrete Command: μ€μ μ€νλ λͺ λ Ήμ ꡬνν©λλ€.
3. Invoker: λͺ λ Ήμ μ€ννλ κ°μ²΄μ λλ€.
4. Receiver: μ€μ λ‘ λͺ λ Ήμ μννλ κ°μ²΄μ λλ€.
μ€νΌμ»€ μμλ‘ μμ보기
μ€νΌμ»€λ₯Ό μμ λ‘ λ€μ΄, μ€νΌμ»€λ₯Ό μΌκ³ λλ κΈ°λ₯μ 컀맨λ ν¨ν΄μΌλ‘ ꡬνν΄λ³΄κ² μ΅λλ€.
1. Command νλ‘ν μ½ μ μ
Command νλ‘ν μ½μ λͺ λ Ήμ μ€ννκ³ μ€ν μ·¨μνλ λ©μλλ₯Ό μ μν©λλ€. λͺ¨λ 컀맨λ κ°μ²΄λ μ΄ νλ‘ν μ½μ μ€μν©λλ€.
protocol Command {
func execute()
func undo()
}
2. Receiver ν΄λμ€ μ μ
Receiver ν΄λμ€λ μ€μ λ‘ λͺ λ Ήμ μννλ ν΄λμ€μ λλ€. μ¬κΈ°μλ μ€νΌμ»€κ° Receiver μν μ ν©λλ€.
class Speaker {
private var isOn: Bool = false
func turnOn() {
isOn = true
print("The speaker is on")
}
func turnOff() {
isOn = false
print("The speaker is off")
}
func getStatus() -> Bool {
return isOn
}
}
turnOn()
: μ€νΌμ»€λ₯Ό μΌλλ€.turnOff()
: μ€νΌμ»€λ₯Ό λλλ€.getStatus()
: μ€νΌμ»€μ νμ¬ μνλ₯Ό λ°νν©λλ€.
3. Concrete Command ν΄λμ€ μ μ
Concrete Command ν΄λμ€λ Command νλ‘ν μ½μ ꡬννλ©°, μ€μ λ‘ μ€νλ λͺ λ Ήμ μ μν©λλ€.
class TurnOnCommand: Command {
private var speaker: Speaker
init(speaker: Speaker) {
self.speaker = speaker
}
func execute() {
speaker.turnOn()
}
func undo() {
speaker.turnOff()
}
}
class TurnOffCommand: Command {
private var speaker: Speaker
init(speaker: Speaker) {
self.speaker = speaker
}
func execute() {
speaker.turnOff()
}
func undo() {
speaker.turnOn()
}
}
TurnOnCommand
: μ€νΌμ»€λ₯Ό μΌλ λͺ λ Ήμ ꡬνν©λλ€.execute
λ©μλλ μ€νΌμ»€λ₯Ό μΌκ³ ,undo
λ©μλλ μ€νΌμ»€λ₯Ό λλλ€.TurnOffCommand
: μ€νΌμ»€λ₯Ό λλ λͺ λ Ήμ ꡬνν©λλ€.execute
λ©μλλ μ€νΌμ»€λ₯Ό λκ³ ,undo
λ©μλλ μ€νΌμ»€λ₯Ό μΌλλ€.
4. Invoker ν΄λμ€ μ μ
Invoker ν΄λμ€λ λͺ λ Ήμ μ€ννκ±°λ μ€ν μ·¨μνλ μν μ ν©λλ€.
class RemoteControl {
private var command: Command?
func setCommand(_ command: Command) {
self.command = command
}
func pressButton() {
command?.execute()
}
func pressUndo() {
command?.undo()
}
}
setCommand(_ command: Command)
: μ€νν λͺ λ Ήμ μ€μ ν©λλ€.pressButton()
: μ€μ λ λͺ λ Ήμ μ€νν©λλ€.pressUndo()
: μ€μ λ λͺ λ Ήμ μ€ν μ·¨μν©λλ€.
5. ν΄λΌμ΄μΈνΈ μ½λ μμ±
ν΄λΌμ΄μΈνΈ μ½λλ Invoker, Concrete Command, κ·Έλ¦¬κ³ Receiver κ°μ²΄λ₯Ό μ¬μ©νμ¬ λͺ λ Ήμ μ€μ νκ³ μ€νν©λλ€.
// ν΄λΌμ΄μΈνΈ μ½λ
let speaker = Speaker()
let remoteControl = RemoteControl()
// μ€νΌμ»€ μΌκΈ° λͺ
λ Ή μμ± λ° μ€ν
let turnOnCommand = TurnOnCommand(speaker: speaker)
remoteControl.setCommand(turnOnCommand)
remoteControl.pressButton()
// The speaker is on
// μ€νΌμ»€ λκΈ° λͺ
λ Ή μμ± λ° μ€ν
let turnOffCommand = TurnOffCommand(speaker: speaker)
remoteControl.setCommand(turnOffCommand)
remoteControl.pressButton()
// The speaker is off
// μ€ν μ·¨μ
remoteControl.pressUndo()
// The speaker is on
RemoteControl
μ λͺ
λ Ήμ μ€μ νκ³ μ€ννλ©°, νμμ λ°λΌ μ€ν μ·¨μλ₯Ό ν μ μμ΅λλ€.
Speaker
λ μ€μ λ‘ μ€νΌμ»€λ₯Ό μΌκ±°λ λλ μμ
μ μνν©λλ€.
컀맨λ ν¨ν΄μ μ₯λ¨μ
μ₯μ
1. λͺ λ Ήμ μΊ‘μν: λͺ λ Ήμ κ°μ²΄λ‘ μΊ‘μννμ¬ ν΄λΌμ΄μΈνΈμ μ€ν κ°μ²΄λ₯Ό λΆλ¦¬ν μ μμ΅λλ€.
2. μ μ°ν λͺ λ Ή μ²λ¦¬: λͺ λ Ήμ 맀κ°λ³μλ‘ μ λ¬νκ³ , νμ μ μ₯νλ©°, μ€ν μ·¨μ κΈ°λ₯μ ꡬνν μ μμ΅λλ€.
3. νμ₯μ±: μλ‘μ΄ λͺ λ Ήμ μ½κ² μΆκ°ν μ μμ΅λλ€. κΈ°μ‘΄ μ½λλ₯Ό μμ νμ§ μκ³ λ μλ‘μ΄ λͺ λ Ή ν΄λμ€λ₯Ό μΆκ°νλ©΄ λ©λλ€.
4. λμ μμ§λ: λͺ λ Ήμ κ°μ²΄λ‘ μΊ‘μνν¨μΌλ‘μ¨, κ° λͺ λ Ή ν΄λμ€λ νΉμ ν μμ μ μ§μ€ν μ μμ΅λλ€.
λ¨μ
1. 볡μ‘μ± μ¦κ°: λͺ λ Ήμ μΊ‘μννλ ν΄λμ€κ° λ§μμ Έ μ½λκ° λ³΅μ‘ν΄μ§ μ μμ΅λλ€.
2. λ©λͺ¨λ¦¬ μ¬μ© μ¦κ°: λͺ λ Ή κ°μ²΄λ₯Ό μμ±νκ³ μ μ₯νκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ μ¬μ©μ΄ μ¦κ°ν μ μμ΅λλ€.
3. λ¨μν μμ μλ μ€λ²ν€λ: λ¨μν μμ μ μν΄ μ»€λ§¨λ ν¨ν΄μ μ¬μ©νλ©΄ λΆνμν μ€λ²ν€λκ° λ°μν μ μμ΅λλ€.
κ²°λ‘
μ μμ μμλ μ€νΌμ»€λ₯Ό μΌκ³ λλ λͺ λ Ήμ 컀맨λ ν¨ν΄μΌλ‘ ꡬνν΄ λ³΄μμ΅λλ€. 컀맨λ ν¨ν΄μ μ¬μ©νλ©΄ κΈ°λ₯μ μΊ‘μννκ³ , λͺ λ Ήμ 맀κ°λ³μννμ¬ μ½λμ μ μ°μ±κ³Ό μ μ§λ³΄μμ±μ λμΌ μ μμ΅λλ€.
컀맨λ ν¨ν΄μ μ΄ν΄νλ λ° λμμ΄ λμκΈ°λ₯Ό λ°λλλ€ π