Add Command presentation
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								command/etc/diagram.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								command/etc/diagram.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 56 KiB | 
							
								
								
									
										243
									
								
								command/etc/presentation.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								command/etc/presentation.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,243 @@ | |||||||
|  | <!-- | ||||||
|  |  | ||||||
|  |     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> | ||||||
		Reference in New Issue
	
	Block a user