import java.util.*;
// Client
public class CommandDemoClient {
	public static void main(String[] args) {
		Broker broker = new Broker();
		Stock appl = new Stock("APPL");
		Order buy100 = new BuyOrder(appl, 100);
		Order sell50 = new SellOrder(appl, 50);
		broker.addOrder(buy100);
		broker.addOrder(sell50);
		broker.placeOrders();
	}
}

// Command
interface Order {
	public void execute();
}

// Concrete Command
class BuyOrder implements Order {

	private Stock stock;
	private int amount;

	public BuyOrder(Stock stock, int amount) {
		this.stock = stock;
		this.amount = amount;
	}

	public void execute() {
		this.stock.buy(this.amount);
	}

}

// Concret Command
class SellOrder implements Order {
	private Stock stock;
	private int amount;

	public SellOrder(Stock stock, int amount) {
		this.stock = stock;
		this.amount = amount;
	}

	public void execute() {
		this.stock.sell(this.amount);
	}
}

// Receiver
class Stock {
	private String symbol;

	public Stock(String symbol) {
		this.symbol = symbol;
	}

	public void buy(int amount) {
		System.out.printf("Bought %d shares of %s\n", amount, symbol);
	}

	public void sell(int amount) {

		System.out.printf("Sold %d shares of %s\n", amount, symbol);
	}

}

// Invoker
class Broker {
	private List<Order> orders;

	public Broker() {
		this.orders = new LinkedList<Order>();
	}

	public void addOrder(Order order) {
		this.orders.add(order);
	}

	public void placeOrders() {
		for(Order order : this.orders) {
			order.execute();
		}
	}
}