Unit 22 command
1 / 75

Unit 22 Command - PowerPoint PPT Presentation

  • Uploaded on

Unit 22 Command. Summary prepared by Kirk Scott. Bronze cast of the furcula of "Sue" the Tyrannosaurus , Field Museum. Design Patterns in Java Chapter 24 Command. Summary prepared by Kirk Scott. The Introduction Before the Introduction.

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
Download Presentation

PowerPoint Slideshow about 'Unit 22 Command' - nevin

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Unit 22 command

Unit 22Command

Summary prepared by Kirk Scott

Bronze cast of the furcula of sue the tyrannosaurus field museum
Bronze cast of the furcula of "Sue" the Tyrannosaurus, Field Museum

Design patterns in java chapter 24 command

Design Patterns in JavaChapter 24Command

Summary prepared by Kirk Scott

The introduction before the introduction
The Introduction Before the Introduction

  • The ordinary way for a client to cause a method to execute is to call it (on an object), in-line

  • There may be other times when the client can’t specify exactly when or where a particular method should be called, but would like to be able to pass the method to another piece of code which will call it when needed

  • This can be accomplished by writing a class which contains the desired method

  • Then at run time an instance of that class can be constructed

  • That object can have the method called on it

  • Passing the method can be accomplished by passing the object to another piece of code as an explicit parameter

  • Book definition: the desired method

  • The intent of the Command pattern is to encapsulate a request in an object.

  • Comment mode on:

  • Notice that this is what has always happened when writing a class definition and putting a public method in it.

  • You learned to pass objects as parameters a long time ago, and within receiving code it is possible to call methods on the parameters

A classic example menu commands
A Classic Example: Menu Commands the desired method

  • Menus and listeners work together using the Command design pattern

  • They illustrate the idea that the application writer can’t predict in advance when a user will select a menu item, but can write the code to deal with it when it happens

  • The the menu:ExitListener is implemented as an inner class of the frame which has the menu

  • This is what its code looks like:

  • private class ExitListener implements ActionListener

  • {

  • public void actionPerformed(ActionEvent event)

  • {

  • System.exit(0);

  • }

  • }

  • The the menu:ExitListener class has an actionPerformed() method in it

  • The actionPerformed() method is executed when the Exit item is clicked in the menu

  • In the constructor for the frame, where the menu is being created, it is impossible to predict when the Exit item will be clicked

  • In other words, it is impossible to predict when the actionPerformed() method will be called

  • That’s all right the menu:

  • The following line of code shows how actionPerformed() is linked to the menu item

  • It is this line of code that illustrates the Command design pattern

  • myExitMenuItem.addActionListener(myExitListener);

  • The object myExitListener is passed to myExitItem as an explicit parameter in the call to addActionListener

  • The the menu:actionPerformed() method can be called on myExitItem in the future in response to a mouse click on myExitItem

  • This is mildly cryptic because programmer written code does not contain the call myExitListener.actionPerformed()

  • The actual call is made by the system through Java’s event handling mechanism

  • Even so, the Command design pattern is evident in the way the item and the listener are linked

Menu commands and the mediator pattern
Menu Commands and the Mediator Pattern as the system calling the

  • Challenge 24.1

  • The mechanics of Java menus make it easy to apply the Command pattern but do not require that you organize your code as commands.

  • In fact, it is common to develop an application in which a single object listens to all the events in a GUI.

  • What pattern does that follow?

  • Comment mode on: as the system calling the

  • This may be an interesting question, but the authors are spinning out into space now

  • This question is unrelated to understanding the design pattern in question.

  • Solution 24.1 as the system calling the

  • Many Java Swing applications apply the Mediator pattern, registering a single object to receive all GUI events.

  • This object mediates the interaction of the components and translates user input into commands for business domain objects.

  • These if/ implement for menus and it could be equally messy for other situationselses would have to determine which item had been clicked

  • Their bodies would consist of blocks of code implementing the appropriate actions

  • Notice how this is exactly the opposite of having many different listeners and relying on polymorphism and dynamic binding to take care of which action to take

The command and strategy patterns
The Command and Strategy Patterns implement for menus and it could be equally messy for other situations

  • If you think back to the Strategy design pattern, for example, that was the kind of mess you were hoping to avoid

  • Instead of having if/else code, the solution was to have different classes for each strategy (in this case, each menu item)

  • Each class would have a method with the same name but containing the implementation of a different strategy (in this case, a different action to be performed)

  • In other words, the handling of menus in Java exhibits the characteristics of two design patterns

  • The fact that there are different listener classes, each with an actionPerformed() method illustrates the Strategy design pattern

  • The fact that listeners are added to items so that their actionPerformed() method can be called in the future when needed illustrates the Command design pattern

  • Recall also, that with the Strategy design pattern you ended up with lots of little classes, each containing just a single method, and which you only needed one instance of

  • The same thing happens with (standard) menus

  • There is a different kind of listener for each menu item

  • Each listener just contains an implementation of actionPerformed()

  • Only one instance of each listener is needed

Anonymous classes
Anonymous Classes up with lots of little classes, each containing just a single method, and which you only needed one instance of

  • The book observes that this is the kind of situation where anonymous classes can be used

  • I still don’t like anonymous classes, but it is important to get used to them because other programmers use them

  • Recall that in CS 202, it was also a listener which was used as an anonymous class example

  • Challenge 24.1 missing

  • Fill in the code for the anonymous subclasses of ActionListener, overriding the actionPerformed() method. Note that this method expects an ActionEvent argument.

  • Solution 24.2 missing

  • Your code should look something like this:

  • Comment mode on:

  • In the book, the solution code is followed by some additional remarks

  • Instead of putting them at the end, they are given up front here, followed by a comment on them, followed by the code

  • Book’s remarks on the solution code: missing

  • Although the actionPerformed() method requires an ActionEvent argument, you can safely ignore it.

  • The menus() method registers a single instance of an anonymous class with the Save menu item and a single instance of another anonymous class with the Load menu item.

  • When these methods are called, there is no doubt about the source of the event.

  • Comment mode on: missing

  • There are two things to say about this:

  • First of all, the book’s statement forewarns us that the creation of the menu in the solution code occurs in a separate method in the application, named menus()

  • Secondly, there is nothing new in the remarks about the missingActionEvent parameter

  • We have always ignored it when writing menu listeners

  • We’ve seen examples in CS 202 where the event parameter is of interest

  • For example, it was necessary to get the (x, y) coordinates of a mouse click to see if it occurred in a cup

  • But quite often, there has been no need to do anything with the event parameter in a listener

  • public class Visualization2 extends Visualization { overheads

  • public static void main(String[] args)

  • {

  • Visualization2 panel = new Visualization2(UI.NORMAL);

  • JFrame frame = SwingFacade.launch(panel, "Operational Model");

  • frame.setJMenuBar(panel.menus());

  • frame.setVisible(true);

  • }

  • public Visualization2(UI ui)

  • {

  • super(ui);

  • }

  • public overheadsJMenuBar menus()

  • {

  • JMenuBarmenuBar = new JMenuBar();

  • JMenu menu = new JMenu("File");

  • menuBar.add(menu);

  • JMenuItemmenuItem = new JMenuItem("Save As...");

  • menuItem.addActionListener(new ActionListener()

  • {

  • public void actionPerformed(ActionEvent e)

  • {

  • save();

  • }

  • });

  • menu.add(menuItem);

  • menuItem = new JMenuItem("Restore From...");

  • menuItem.addActionListener(new ActionListener()

  • {

  • public void actionPerformed(ActionEvent e)

  • {

  • restore();

  • }

  • });

  • menu.add(menuItem);

  • return menuBar;

  • }

  • public void save() overheads

  • {

  • try

  • {

  • mediator.save(this);

  • }

  • catch (Exception ex)

  • {

  • System.out.println("Failed save: " + ex.getMessage());

  • }

  • }

  • public void restore()

  • {

  • try

  • {

  • mediator.restore(this);

  • }

  • catch (Exception ex)

  • {

  • System.out.println("Failed restore: " + ex.getMessage());

  • }

  • }

  • }

Using command to supply a service
Using Command to Supply a Service overheads

  • In the previous example, half the work was done by the Java API

  • All that was necessary was to plug a command into an existing context

  • In other words, the addActionListener() machinery is provided by the API

  • It is also possible for a programmer to provide both the context and the command

The next example
The Next Example overheads

  • The next example shows how to time how long it takes to execute some method, methodA()

  • There will be a timing method, methodB(), that takes as its input parameter an object which can have methodA() called on it

  • Inside methodB() the call to methodA() on the input parameter will be sandwiched between timing code

Setting up the command to be passed
Setting up the Command to be Passed overheads

  • Let there be an abstract class named Command which includes this abstract method declaration:

  • public abstract void execute();

  • A concrete command class would extend Command and implement execute()

  • The abstract method, execute(), defines the interface for using a command object

Setting up the code that will receive the command
Setting up the Code that will Receive the Command overheads

  • In addition to a concrete command class, the example includes a class named CommandTimer

  • This class contains a static method named time()

  • The time() method takes as an input parameter an instance of a command class

  • execute() is called on that command class object in the body of the time() method

  • public class passage of time can be placed before and after the call to execute() in the time() methodCommandTimer

  • {

  • public static long time(Command command)

  • {

  • long t1 = System.currentTimeMillis();

  • command.execute();

  • long t2 = System.currentTimeMillis();

  • return t2 – t1;

  • }

  • }

  • The book next presents code to test the setup, with the call that causes the execution missing

  • The code with the missing step is not reproduced here because it is immediately followed by a challenge to fill in the missing line of code

  • It’s easier to just go directly to the complete example with all of the pieces included

  • The authors are trying to illustrate the use of a that causes the execution missingJUnit test framework

  • This is mentioned in Appendix C, on the source code, and also at various points in the text

  • You don’t have to worry about it

  • It just adds a little stuff at the end of the example code which you can ignore

  • They also use the anonymous class syntax when creating the command

  • Challenge 24.3 that causes the execution missing

  • Complete the assignment statement that sets the value for actual in such a way that the doze command is timed.

  • Solution 24.3 that causes the execution missing

  • The testSleep() method passes the doze command to the time() utility method.

  • Comment mode on:

  • The code creates an instance of Command, named doze

  • It then calls the static time() method, passing doze as a parameter

  • See the code on the next overhead.

  • public class that causes the execution missingTestCommandTimer extends TestCase

  • {

  • public void testSleep()

  • {

  • Command doze = new Command()

  • {

  • public void execute()

  • {

  • try

  • {

  • Thread.sleep(2000 + Math.round(10 * Math.random()));

  • }

  • catch (InterruptedException ignored)

  • {

  • }

  • }

  • };

  • long actual = CommandTimer.time(doze);

  • long expected = 2000;

  • long delta = 5;

  • assertTrue("Should be " + expected + " +/- " + delta + " ms",

  • expected - delta <= actual

  • && actual <= expected + delta);

  • }

  • }

  • The point of the foregoing example code was that it created an object of the Command class named doze

  • This object contained an execute() method that caused it to sleep for a random amount of time

  • The line of code shown below made use of the command machinery given previously to time how long it takes for doze.execute() to run

  • long actual = CommandTimer.time(doze);

Command hooks
Command Hooks an object of the Command class named doze

  • This section builds on material that was presented in the chapter on the Template Method

  • You may recall that in that chapter I restricted myself to the discussion of sorting as implemented in the Java API

  • I did not pursue the other examples

  • Therefore, it is not possible to pursue this example in this chapter

  • You are not responsible for it

Command in relation to other patterns
Command in Relation to Other Patterns an object of the Command class named doze

  • The book states that command is similar to a pattern in which a client knows when an action is required but doesn’t know exactly which operation to call.

  • This may be true, but this is not exactly what the examples in this chapter have illustrated.

  • In the menu example, there was uncertainty about the timing of the call (sometime in the future) but which actionPerformed() method was linked to which item was well defined

  • In the timing example there was also no doubt about what to do—just a need to encase a call to it in other predefined blocks of code

  • Challenge 24.5 of the call (sometime in the future) but which

  • Which pattern addresses the situation in which a client knows when to create an object but doesn’t know which class to instantiate?

  • Comment mode on: of the call (sometime in the future) but which

  • This challenge introduces yet another slight difference between the thing they’re talking about and the examples they’re giving:

  • Now we’re talking about the creation of an object.

  • Since we don’t know what to create, this must mean calling a “creational” method rather than calling a constructor.

  • Solution 24.5 of the call (sometime in the future) but which

  • In Factory Method, a client knows when to create a new object but not what kind of object to create.

  • Factory Method moves object creation to a method that isolates a client from knowing which class to instantiate.

  • This principle also occurs in Abstract Factory.

  • Comment mode on: of the call (sometime in the future) but which

  • The foregoing observation is certainly true

  • After a while all of the patterns begin to look similar

  • In particular, you observe a “meta pattern” that there are some patterns that work with vanilla methods, and there are other analogous patterns that work with methods that create objects

An example using command with other patterns
An Example using Command with other Patterns of the call (sometime in the future) but which

  • The Command design pattern can be used with other design patterns

  • The book gives code showing Command and Mediator being used together in a MVC design for their Visualization program

  • MVC hasn’t been covered yet.

  • Still, the example can be covered as a combination of mediator and command.

  • In this example the mediator class is responsible for returning instances of different kinds of listeners, as needed, for the buttons created in the application

  • The example code which will be given next shows part of the controller portion of an MVC design

  • It’s the creation of a graphical button in a visualization with a listener attached to it

  • The code contains a call like this: returning instances of different kinds of listeners, as needed, for the buttons created in the applicationmediator.undoAction()

  • This doesn’t “undo an action” on the mediator

  • It returns an “undo listener” which the mediator is responsible for keeping track of

  • The listener returned is used as an explicit parameter in this call: undoButton.addActionListener()

  • This is the point where the command pattern is in evidence

  • Attaching a listener to a button is analogous to attaching a listener to a menu item

  • This example is analogous to the first example in the unit except that the listener comes from the mediator

  • protected this call: JButtonundoButton()

  • {

  • if (undoButton == null)

  • {

  • undoButton = ui.createButtonCancel();

  • undoButton.setText("Undo");

  • undoButton.setEnabled(false);

  • undoButton.addActionListener(mediator.undoAction());

  • }

  • return undoButton;

  • }

Other code for this example
Other Code for this Example this call:

  • If you go to the book’s Web site you can find the code for the VisMediator class

  • Details of that class are not of interest at the moment

  • All you need to know is that it contains implementations of methods like undoAction(), which return listeners

  • Methods of this kind with different names return different kinds of listeners

Actionperformed is the command that is packaged in a listener
actionPerformed this call: () is the Command that is Packaged in a Listener

  • When the listener is added to the button, the command that is being packaged up in the object is actionPerformed()

  • Different versions of actionPerformed() contain calls to methods (commands) that do different things

  • These commands are ultimately what is triggered by this use of the Command design pattern

Another example
Another Example this call:

  • The other example for this unit is built on the examples for the previous two patterns, factory method and abstract factory

  • It is available on the course Web page if you want to take a look at it

Uml for the pattern
UML for the Pattern this call:

  • A progression of UML diagrams for the pattern is shown on the following overheads

  • The first diagram shows the simple roots of the pattern

  • The second shows the direct use of a command

  • The third shows that in reality, a given context could make similar use of many different commands

Lasater s uml for the pattern
Lasater’s this call: UML for the Pattern

  • Lasater’s diagram attempts to show that a generic execute() command is really just a wrapper for a call to some action that is significant within the problem domain or context.

Summary this call:

  • The Command design pattern makes it possible to encapsulate a request for service in an object

  • In other words, calls to methods can be managed by passing around objects which can receive the calls

  • The actual calls can be made at the time needed or when necessary conditions have been met

  • The Command design pattern is illustrated by the way menus are constructed in Java

  • The listener for an item is an object which can have the actionPerformed() method called on it

  • The listener is passed to the item as an explicit parameter in a method call

  • actionPerformed() is actually executed only at the time that the item in the menu is selected

  • The second example illustrated how the Command design pattern can be used to embed a call between blocks of code

  • The third example in the book was not pursued, and you are not responsible for it

  • That example happened to illustrate that the command pattern can be used to accomplish things that the Template Method design pattern can also be used to accomplish

The end
The End context in which it’s used