14. Command
- Intent:
    
- Encapsulate a request as an object, thereby letting you parameterizeclients with different requests, queue or log requests, and support undoable operations.
 
 - Also Known As:
    
- Action, Transaction
 
 - Applicability:
    
- parameterize objects by an action to perform,
 - specify, queue, and execute requests at different times.
 - support undo.
 - support logging changes so that they can be reapplied in case of a system crash.
 - structure a system around high-level operations built on primitives operations.
 
 - Structure:
 


- Participants:
    
- Command
        
- declares an interface for executing an operation.
 
 - ConcreteCommand
        
- defines a binding between a Receiver object and an action.
 - implements Execute by invoking the corresponding operation(s) on Receiver.
 
 - Client
        
- creates a ConcreteCommand object and sets its receiver.
 
 - Invoker
        
- asks the command to carry out the request.
 
 - Receiver
        
- knows how to perform the operations associated with carrying out a request. Any class may serve as a Receiver.
 
 
 - Command
        
 - Collaborations
    
- The client creates a ConcreteCommand object and specifies its receiver.
 - An Invoker object stores the ConcreteCommand object.
 - The invoker issues a request by calling Execute on the command. When commandsare undoable, ConcreteCommand stores state for undoing thecommand prior to invoking Execute.
 - The ConcreteCommand object invokes operations on its receiver to carryout the request.
 
 - Consequences:
    
- 1.Command decouples the object that invokes the operation from the one that knows how to perform it.
 - 2.Commands are first-class objects.
 - 3.You can assemble commands into a composite command.
 - 4.It’s easy to add new Commands
 
 - Related Patterns:
    
- A Composite can be used to implement MacroCommands.
 - A Memento can keep state the command requires to undo its effect.
 - A command that must be copied before being placed on the history list acts as a Prototype.
 
 - Code Sample: Command
 

	public interface Command {  
	    public void exe();  
	} 
	public class MyCommand implements Command {  
	  
	    private Receiver receiver;  
	      
	    public MyCommand(Receiver receiver) {  
	        this.receiver = receiver;  
	    }  
	  
	    @Override  
	    public void exe() {  
	        receiver.action();  
	    }  
	}  
	public class Receiver {  
	    public void action(){  
	        System.out.println("command received!");  
	    }  
	} 
	public class Invoker {  
	      
	    private Command command;  
	      
	    public Invoker(Command command) {  
	        this.command = command;  
	    }  
	  
	    public void action(){  
	        command.exe();  
	    }  
	}  
	public class Test {  
	  
	    public static void main(String[] args) {  
	        Receiver receiver = new Receiver();  
	        Command cmd = new MyCommand(receiver);  
	        Invoker invoker = new Invoker(cmd);  
	        invoker.action();  
	    }  
	}