커맨드 패턴은 객체가 특정 기능을 바로 수행하거나 나중에 트리거할 때 필요한 모든 정보를 캡슐화하는 행동 패턴이다. 캡슐화하는 정보는 다음과 같다.
Command, Receiver, Invoker, Client 클래스로 구성된다.
커맨드 패턴의 목적은 다음과 같다
커맨드 패턴은 다음과 같은 상황에 적합하다.
증권거래소를 커맨드 패턴으로 구현해보자. 일반적으로 고객이 주식을 직접 사거나 팔지 않고 에이전트나 브로커가 고객과 거래소 사이에서 중재자 역할을 한다. 중개사는 고객의 요청을 받아 채임지고 거래소에 전달해 처리한다.
커맨드 패턴에는 Command, ConcreateCommand, Invoker, Receiver 등 총 4개 객체로 구성된다. 주식매매 시나리오에서 우선 고객의 주문을 나타내는 Order인터페이스를 작성한다. 다음으로 주식을 매매하는 ConcreateCommand 클래스를 작성한다. 증권거래소를 대표하는 클래스도 필요하다. Receiver 클래스는 실제 주식을 거래를 담당하고 Invoker인 중개사는 거래를 개시하고 Receiver에 처리를 요청한다.
from abc import ABCMeta, abstractmethod
# Command
class Order(metaclass=ABCMeta):
@abstractmethod
def execute(self):
pass
# ConcreateCommand
class BuyStockOrder(Order):
def __init__(self, stock):
self.stock = stock
def execute(self):
self.stock.buy()
class SellStockOrder(Order):
def __init__(self, stock):
self.stock = stock
def execute(self):
self.stock.sell()
# Receiver : 증권거래 시스템
class StockTrade:
def buy(self):
print("Buy stocks")
def sell(self):
print("Sell stocks")
# Invoker: 에이전트
class Agent:
def __init__(self):
self.__orderQueue= []
def placeOrder(self, order):
self.__orderQueue.append(order)
order.execute()
if __name__ == '__main__':
#client
stock = StockTrade()
buyStock = BuyStockOrder(stock)
sellStock = SellStockOrder(stock)
#Invoker
agent = Agent()
agent.placeOrder(buyStock)
agent.placeOrder(sellStock)
Buy stocks
Sell stocks