diff --git a/command/etc/diagram.png b/command/etc/diagram.png new file mode 100644 index 000000000..1d3494292 Binary files /dev/null and b/command/etc/diagram.png differ diff --git a/command/etc/presentation.html b/command/etc/presentation.html new file mode 100644 index 000000000..88a3f0c66 --- /dev/null +++ b/command/etc/presentation.html @@ -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> \ No newline at end of file