커맨드 디자인 패턴을 읽은 후 질문이 있습니다. -커맨드 디자인 패턴
클라이언트에서 구체적인 명령과 수신자 객체를 만드는 이유는 무엇입니까? 호출자 클래스에서 초기화 할 수 없습니까?
클라이언트가 호출자를 만들어 호출자에게 전달해야한다고 생각합니다. 호출자는 모든 것을 처리해야합니다. 이렇게함으로써
,
- 우리는 클라이언트에 덜 의존이있다.
- 클래스 다이어그램의 디자인은 실제 디자인과 완전히 다릅니다.
예 - 클라이언트가 주식 매매에 대한 일부 주문을 생성합니다. 그런 다음 주문이 상담원에게 전송됩니다. 상담원이 주문을 받아 StockTrade 시스템에 보냅니다.
여기서 에이전트는 호출자이며 주식 거래 시스템은 수신자입니다. 명령 디자인 패턴에 따라
:
public interface IOrder
{
public abstract void execute ();
}
class StockTrade {
public void buy() {
System.out.println("You want to buy stocks");
}
public void sell() {
System.out.println("You want to sell stocks ");
}
}
class Agent {
public Agent()
{
}
void placeOrder(IOrder order) {
order.execute();
}
}
//ConcreteCommand Class.
class BuyStockOrder implements Order {
private StockTrade stock;
public BuyStockOrder (StockTrade st) {
stock = st;
}
public void execute() {
stock . buy();
}
}
//ConcreteCommand Class.
class SellStockOrder implements IOrder {
private StockTrade stock;
public SellStockOrder (StockTrade st) {
stock = st;
}
public void execute() {
stock . sell();
}
}
// Client
public class Client {
public static void main(String[] args) {
StockTrade stock = new StockTrade();
BuyStockOrder bsc = new BuyStockOrder (stock);
SellStockOrder ssc = new SellStockOrder (stock);
Agent agent = new Agent();
agent.placeOrder(bsc); // Buy Shares
agent.placeOrder(ssc); // Sell Shares
}
}
이제 클래스는 수신기, 콘크리트 명령 및 에이전트에 대한 종속성이 있습니다.
클라이언트에서 수신자와 구체적인 명령 종속성을 이동할 수 없습니까?
Agent Class
class Agent {
public Agent()
{
}
void BuyStock(BuyStockRequest request)
{
IOrder order = new BuyStockOrder();
order.execute(request);
}
void SellStock(SellStockRequest request)
{
IOrder order = new SellStockOrder();
order.execute(request);
}
}
//ConcreteCommand Class.
class BuyStockOrder implements IOrder {
private StockTrade stock;
public BuyStockOrder() {
stock = new StockTrade;
}
public void execute(BuyStockRequest request) {
stock.Name = request.Name;
stock.Price = request.Price;
stock.buy();
}
}
//ConcreteCommand Class.
class SellStockOrder implements IOrder {
private StockTrade stock;
public SellStockOrder() {
stock = new StockTrade;
}
public void execute(SellStockRequest request) {
stock.Name = request.Name;
stock.Price = request.Price;
stock.sell();
}
}
//Request Class
class BuyStockRequest
{
public string Name {get; set;}
public decimal price {get; set;}
}
class SellStockRequest
{
public string Name {get; set;}
public decimal price {get; set;}
}
Client
public class Client {
public static void main(String[] args) {
BuyStockRequest request = new BuyStockRequest();
request.Name = "XYZ";
request.Price = 100;
Agent agent = new Agent();
agent.BuyStock(request); // Buy Shares
}
}
질문이 의미가 없습니다 (적어도 나에게). 더 자세하게 얘기해 주 시겠어요? –
예를 들어 제 질문을 업데이트했으며 이번에는 더 명확해질 수 있기를 바랍니다. – pchajer