๋ฐ์ํ
Command Pattern
์ปค๋งจ๋ ํจํด์ ์์ฒญ์ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์์ฒญ์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํ๊ฒ ๋ง๋๋ ํ๋ ํจํด์ ๋๋ค.
- ๋ค์ํ ์์ฒญ์ ๋ฉ์๋๋ก ๋งค๊ฐ๋ณ์ํํ๊ณ , ์์ฒญ์ ์คํ์ ์ง์ฐํ๊ฑฐ๋ ํ์ ๋ฃ์ ์ ์์ผ๋ฉฐ, ์คํ ์ทจ์ ๊ธฐ๋ฅ์ ์ง์ํ ์ ์์ต๋๋ค.
์ฌ๋ฌ ๋ช ๋ น๋ค์ ์ถ์ํํด์ class๋ก ์ ์ํ๊ณ Object๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ๋ Pattern์ ๋๋ค.
- ๋ํ ํ์(Behavior) ํจํด์ ์ํฉ๋๋ค.
- ํด๋์ค๊ฐ ์ผ์ ์คํํ ๋, ์์ ์ ํด๋์ค or ๋ค๋ฅธ ํด๋์ค์ Method๋ฅผ ํธ์ถํฉ๋๋ค.
- ๊ทธ๋ฌ๋ Method๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ๋ Object์ ๋ฐ์๋์ง๋ง, ์ผ์ ์ด๋ ฅ์ ์ด๋์๋ ๋จ์ง ์์ต๋๋ค.
- ์ด๋, ‘์ด ์ผ์ ์คํํ์์ค’ ๋ผ๋ ‘๋ช ๋ น’์ ํํํ๋ ํด๋์ค๊ฐ ์์ผ๋ฉด ํธํฉ๋๋ค.
- ๋ช ๋ น์ ๋ํ๋ด๋ ํด๋์ค์ ์ธ์คํด์ค๋ก ํ๋์ ‘๋ฌผ๊ฑด’์ฒ๋ผ ํํํ ์ ์์ต๋๋ค.
- ๋ช ๋ น์ ๋ํ ์ด๋ ฅ์ ๊ด๋ฆฌํ๊ณ ์ถ์ ๋์๋ ๊ทธ ์ธ์คํด์ค์ ์งํฉ์ ๊ด๋ฆฌํ๋ฉด ๋ฉ๋๋ค.
- ๋ช ๋ น์ ์งํฉ์ ์ ์ฅํด์ฃผ๋ฉด ๊ฐ์ ๋ช ๋ น์ ์ฌ์คํํ ์๋ ์๊ณ , ๋ณต์์ ๋ช ๋ น์ ๋ชจ์์ ์๋ก์ด ๋ช ๋ น์ผ๋ก ์ฌ์ด์ฉ ํ ์ ์์ต๋๋ค.
Diagram
- Command: ๋ช ๋ น์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ์ญํ ์ ๋๋ค.
- ConcreteCommand (Command1): ์ค์ ๋ก ์คํ๋๋ ๊ธฐ๋ฅ์ ๊ตฌํ, ์ฆ Command๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
- Invoker: ๋ช ๋ น์ ํ๋์ ๊ฐ์ํ๋ ์ญํ ์ ํ๋ฉฐ, Command์์ ์ ์๋๋ API๋ฅผ ํธ์ถํฉ๋๋ค.
- Receiver: Command๊ฐ ๋ช ๋ น์ ์คํํ ๋ ๊ทธ ๋์์ด ๋๋ ์ญํ , ๋ช ๋ น์ ๋ฐ์๋ค์ด๋ ์์ ์๋ผ๊ณ ์ง์นญํฉ๋๋ค.
Example
class Command:
def execute(self):
pass
class PrintCommand(Command):
def __init__(self, print_str: str):
self.print_str = print_str
def execute(self):
print(f"from print command: {self.print_str}")
- Base Interface๋ก execute() ๋ฉ์๋๋ง ์กด์ฌํฉ๋๋ค.
- Command๋ฅผ ์์๋ฐ์ต๋๋ค.
- __init__ ๋ฉ์๋์์ print_str์ ์ธ์๋ก ๋ฐ์ ๋ด๋ถ์ ์ ์ฅํฉ๋๋ค.
- execute() ๋ฉ์๋์์ ์ ์ฅ๋์ด ์๋ print_str์ ์ถ๋ ฅํฉ๋๋ค.
first_command = PrintCommand("first command")
second_command = PrintCommand("second command")
first_command.execute()
second_command.execute()
from print command: first command
from print command: second command
- PrintCommand ๊ฐ์ฒด์ธ first_command, second_command ์ ์์ฑํฉ๋๋ค.
- ์์ฑ๋ ๊ฐ์ฒด๋ค์ ์คํ์ํค๋ฉด ์์ํ ๋๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
์กฐ๊ธ ๋ ๋ณต์กํ Command ํด๋์ค ๊ตฌ์กฐ
- Dog: ‘sit’,’stay’ 2๊ฐ์ง ๋ช ๋ น์ด๋ฅผ ์์ ๋ฃ์ต๋๋ค.
- DogCommand:
- Command์์ ์์์ ๋ฐ์ต๋๋ค.
- Dog์์ ๋ช ๋ น์ ๋ด๋ฆฌ๋ class๋ก ๋ด๋ถ์ ๋ช ๋ น์ ๋ด๋ฆด Dog Object๊ฐ ์กด์ฌํฉ๋๋ค.
- ๋ช ๋ น๋ค์ ์ ์ฅํ๋ ๋ฆฌ์คํธ์ธ Commands๊ฐ ์กด์ฌํฉ๋๋ค.
from typing import List
class Dog:
def sit(self):
print("The dog sat down")
def stay(self):
print("The dog is staying")
class DogCommand(Command):
def __init__(self, dog: Dog, commands: List[str]):
self.dog = dog
self.commands = commands
def execute(self):
for command in self.commands:
if command == 'sit':
self.dog.sit()
elif command == 'stay':
self.dog.stay()
- Dog
- sit(), stay() 2๊ฐ์ง ๋ช ๋ น ํจ์๊ฐ ์กด์ฌํฉ๋๋ค.
- Dog Command
- Command๋ฅผ ์์๋ฐ์ต๋๋ค.
- __init__: Dog object์ ๋ช ๋ น์ด list์ธ commands๋ฅผ ์ธ์๋ก ๋ฐ์ ๋ด๋ถ์ ์ ์ฅํฉ๋๋ค.
- execute()
- commands ๋ช ๋ น ๋ฆฌ์คํธ์์ string ํ๋์ฉ ์ถ์ถํฉ๋๋ค.
- string์ด 'sit'์ด๋ฉด sit() ํจ์๋ฅผ ์คํํฉ๋๋ค.
- string์ด 'stay'์ด๋ฉด stay() ํจ์๋ฅผ ์คํํฉ๋๋ค.
baduk = Dog()
dog_command = DogCommand(baduk, ['stay', 'sit', 'sit'])
dog_command.execute()
- ๋ช ๋ น์ ๋ค์ Dog object์ธ baduk ์ ์์ฑํฉ๋๋ค.
- DogCommand object์ธ dog_command ์์ฑ ํ baduk๊ณผ ๋ช ๋ น์ด list์ 'stay', 'sit', 'sit'์ ๋ฃ์ด์ ์ ๋ฌํฉ๋๋ค.
- ์คํ์ํค๋ฉด ๊ฐ์์ง๋ stay๋ฅผ ํ ํ 2๋ฒ sit ์คํํฉ๋๋ค.
- Command Interface๋ Command Class
- Command๋ฅผ ์์๋ฐ๋ Command1์ Dog Command Class,
- Command1์ ๋ช ๋ น์ ๋ฐ๋ Object์ธ Receiver1์ Dog์ ๋์๋ฉ๋๋ค.
์ฌ๊ธฐ์ Invoker Class๋ ๊ตฌํ๋์ง ์์์ต๋๋ค.
class Invoker:
def __init__(self):
self.command_list = []
def addCommand(self, command: Command):
self.command_list.append(command)
def runCommands(self):
for command in self.command_list:
command.execute()
Invoker ํด๋์ค:
- __init__: ๋ช ๋ น๋ค์ ์ ์ฅํ๋ ๋ฆฌ์คํธ์ธ command_list๊ฐ ์กด์ฌํฉ๋๋ค.
- addCommand: Command ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ ํจ์์ ๋๋ค.
- runCommands: command_list์ ๋ชจ๋ command๋ฅผ execute()๋ฅผ ํตํด ์คํ์ํค๋ ํจ์์ ๋๋ค.
invoker = Invoker()
invoker.addCommand(first_command)
invoker.addCommand(dog_command)
invoker.addCommand(second_command)
invoker.runCommands()
- Invoker ๊ฐ์ฒด์ธ invoker๋ฅผ ์์ฑํ ํ addCommand๋ฅผ ํตํด ์ด์ ์ ์์ฑํ๋ Command ๊ฐ์ฒด๋ค์ ์ถ๊ฐํฉ๋๋ค.
- runCommands๋ฅผ ํตํด ์คํํ๋ฉด ๋ชจ๋ ๋ช ๋ น์ด๊ฐ ์ฐจ๋ก๋๋ก ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Command Pattern์ ๋ช ๋ น์ ์ถ์ํํด์ ๊ฐ์ฒด๋ก ๋ค๋ฃจ๋ ํจํด์ ๋๋ค.
๋ฐ์ํ
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Memento Pattern - ๋ฉ๋ฉํ ํจํด (0) | 2024.06.09 |
---|---|
[Design Pattern] Chain of Responsibility (0) | 2024.06.09 |
[Design Pattern] Strategy Pattern - ์ ๋ต ํจํด (0) | 2024.06.08 |
[Design Pattern] Composite Pattern - ์ปดํฌ์งํธ ํจํด (0) | 2024.06.08 |
[Design Pattern] Flyweight Pattern - ํ๋ผ์ด์จ์ดํธ ํจํด (0) | 2024.06.06 |