243 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!--
 | |
| 
 | |
|     The MIT License
 | |
|     Copyright (c) 2017 Rodolfo Forte
 | |
| 
 | |
|     Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
|     of this software and associated documentation files (the "Software"), to deal
 | |
|     in the Software without restriction, including without limitation the rights
 | |
|     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
|     copies of the Software, and to permit persons to whom the Software is
 | |
|     furnished to do so, subject to the following conditions:
 | |
| 
 | |
|     The above copyright notice and this permission notice shall be included in
 | |
|     all copies or substantial portions of the Software.
 | |
| 
 | |
|     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
|     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
|     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | |
|     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | |
|     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | |
|     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | |
|     THE SOFTWARE.
 | |
| 
 | |
| -->
 | |
| <!DOCTYPE html>
 | |
| <html>
 | |
|   <head>
 | |
|     <title>Design Patterns - Command Presentation</title>
 | |
|     <meta charset="utf-8">
 | |
|     <style>
 | |
|       @import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz);
 | |
|       @import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic);
 | |
|       @import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
 | |
| 
 | |
|       body { font-family: 'Droid Serif'; }
 | |
|       h1, h2, h3 {
 | |
|         font-family: 'Yanone Kaffeesatz';
 | |
|         font-weight: normal;
 | |
|       }
 | |
|       .remark-code, .remark-inline-code { font-family: 'Ubuntu Mono'; }
 | |
| 	  
 | |
| 	  blockquote {
 | |
| 		border-left: 0.3em solid rgba(0,0,0,0.5);
 | |
| 		padding: 0 15px;
 | |
| 		font-style: italic;
 | |
| 	  }
 | |
| 	  
 | |
| 	  img {
 | |
| 		max-width:100%;
 | |
| 	  }
 | |
|     </style>
 | |
|   </head>
 | |
|   <body>
 | |
|     <textarea id="source">
 | |
| 
 | |
| class: center, middle
 | |
| 
 | |
| # Command
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Also known as
 | |
| 
 | |
| * Action, Transaction
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Intent
 | |
| 
 | |
| * Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Explanation
 | |
| 
 | |
| * [Wikipedia](https://en.wikipedia.org/wiki/Command_pattern) says:
 | |
|   > In object-oriented programming, the command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. This information includes the method name, the object that owns the method and values for the method parameters.
 | |
| 
 | |
| <br />
 | |
| 
 | |
| * In plain words:
 | |
| 
 | |
|   * Enable the construction of components that are able to delegate, sequence or execute method calls at a time of their choosing;
 | |
|   
 | |
| ---
 | |
| 
 | |
| # Explanation
 | |
| 
 | |
| Four terms always associated with the pattern: 
 | |
| 
 | |
|   * Command
 | |
| 	* Object that knows about the receiver and invokes a method of the receiver;
 | |
|   
 | |
|   * Receiver
 | |
| 	* Object that does the work;
 | |
|   
 | |
|   * Invoker
 | |
| 	* Knows how to execute a command, and optionally does the bookkeeping about the command execution;
 | |
|   
 | |
|   * Client 
 | |
| 	* Decides which commands to execute at which points, passing the command object to the invoker object;
 | |
|   
 | |
| ---
 | |
| 
 | |
| # Example
 | |
| 
 | |
| In our example, a Wizard can cast spells on targets.
 | |
| 
 | |
|   * Spell will be the command (implements the Command interface);
 | |
|   * Goblin (a Target object) will be the receiver;
 | |
|   * Wizard will be the invoker;
 | |
|   * App will be the client;
 | |
| 
 | |
| ``` 
 | |
| 
 | |
| 	//App.java
 | |
| 	public static void main(String[] args) {
 | |
| 		Wizard wizard = new Wizard();
 | |
| 		Goblin goblin = new Goblin();
 | |
| 		goblin.printStatus(); 		//Goblin, [size=normal] [visibility=visible]
 | |
| 
 | |
| 		wizard.castSpell(new ShrinkSpell(), goblin);
 | |
| 		wizard.castSpell(new InvisibilitySpell(), goblin);
 | |
| 
 | |
| 		goblin.printStatus(); 		//Goblin, [size=small] [visibility=invisible]
 | |
| 
 | |
| 		wizard.undoLastSpell();
 | |
| 
 | |
| 		goblin.printStatus(); 		//Goblin, [size=small] [visibility=visible]
 | |
| 
 | |
| 		wizard.redoLastSpell();
 | |
| 		goblin.printStatus(); 		//Goblin, [size=small] [visibility=invisible]
 | |
| 	}
 | |
| ```
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Diagram
 | |
| 
 | |
| .center[]
 | |
| 
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Applicability
 | |
| 
 | |
| Use the Command pattern when you want to:
 | |
| 
 | |
| * Parameterize objects by an action to perform; 
 | |
|   * You can express such parameterization in a procedural language with a callback function, that is, a function that's registered somewhere to be called at a later point;
 | |
|   
 | |
|   * Commands are an object-oriented replacement for callbacks;
 | |
| 
 | |
|   <br />
 | |
|   
 | |
| * Specify, queue, and execute requests at different times; 
 | |
|   * A Command object can have a lifetime independent of the original request;
 | |
|   
 | |
|   * If the receiver of a request can be represented in an address space-independent way, then you can transfer a command object for the request to a different process and fulfill the request there;
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Applicability
 | |
| 
 | |
| Use the Command pattern when you want to:
 | |
| 
 | |
| * Support undo; 
 | |
|   * The Command's execute() operation can store state for reversing its effects in the command itself;
 | |
|   
 | |
|   * The Command interface must have an added unexecute() operation that reverses the effects of a previous call to execute;
 | |
|   
 | |
|   * Executed commands are stored in a history list;
 | |
|   
 | |
|   * Unlimited-level undo and redo is achieved by traversing this list backwards and forwards calling unexecute() and execute(), respectively;
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Applicability
 | |
|   
 | |
| Use the Command pattern when you want to:
 | |
|   
 | |
| * Support logging changes so that they can be reapplied in case of a system crash;
 | |
|   * By augmenting the Command interface with load() and store() operations, you can keep a persistent log of changes;
 | |
|   
 | |
|   * Recovering from a crash involves reloading logged commands from disk and re-executing them with the execute operation;
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Applicability
 | |
| 
 | |
| Use the Command pattern when you want to:
 | |
| 
 | |
| * Structure a system around high-level operations build on primitive operations;
 | |
|   * Such a structure is common in information systems that support transactions;
 | |
|   
 | |
|   * A transaction encapsulates a set of changes to data;
 | |
|   
 | |
|   * The Command pattern offers a way to model transactions; 
 | |
|   
 | |
|   * Commands have a common interface, letting you invoke all transactions the same way;
 | |
|   
 | |
|   * The pattern also makes it easy to extend the system with new transactions
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Use Cases
 | |
| 
 | |
| * To keep a history of requests;
 | |
| 
 | |
| * Implement callback functionality;
 | |
| 
 | |
| * Implement the undo functionality;
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Real world examples
 | |
| 
 | |
| [java.lang.Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html)
 | |
| 
 | |
| [Netflix Hystrix](https://github.com/Netflix/Hystrix/wiki)
 | |
| 
 | |
| [javax.swing.Action](http://docs.oracle.com/javase/8/docs/api/javax/swing/Action.html)
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Credits
 | |
| 
 | |
| * [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612)
 | |
| 
 | |
| ---
 | |
| 
 | |
| # Tutorials
 | |
| 
 | |
| * Source code http://java-design-patterns.com/patterns/command/
 | |
| 
 | |
|     </textarea>
 | |
|     <script src="https://gnab.github.io/remark/downloads/remark-latest.min.js">
 | |
|     </script>
 | |
|     <script>
 | |
|       var slideshow = remark.create();
 | |
|     </script>
 | |
|   </body>
 | |
| </html> |