Lecture 25: Advanced Command patterns

Post on 22-Feb-2016

47 views 0 download

description

Computer Science 313 – Advanced Programming Topics. Lecture 25: Advanced Command patterns. Command Pattern Intent. Decouples action invocation from its execution Write classes independent of operation executed Encapsulate operation as an object - PowerPoint PPT Presentation

Transcript of Lecture 25: Advanced Command patterns

LECTURE 25:ADVANCED COMMAND PATTERNS

Computer Science 313 – Advanced Programming Topics

Command Pattern Intent

Decouples action invocation from its execution Write classes independent of operation

executed Encapsulate operation as an object

Makes possible buffering or logging operations

Undo-ing operations can be supported with ease

Code will support combining or extending actions

Command Pattern Intent

Decouples action invocation from its execution Write classes independent of operation

executed Encapsulate operation as an object

Makes possible buffering or logging operations

Undo-ing operations can be supported with ease

Code will support combining or extending actions

Command Pattern Example

public class Quitter implements ActionListener {public void actionPerformed(ActionEvent e) { System.exit(0);}

}

public class Bob extends JFrame {⁞JMenuItem quit = new JMenuItem(“Quit”);quit.addActionItem(new Quitter());⁞

}

Command Pattern Example

public class Quitter implements ActionListener {public void actionPerformed(ActionEvent e) { System.exit(0);;}

}

public class Bob extends JFrame {⁞JMenuItem quit = new JMenuItem(“Quit”);quit.addActionItem(new Quitter());⁞

}

Client

Command Pattern Example

public class Quitter implements ActionListener {public void actionPerformed(ActionEvent e) { System.exit(0);}

}

public class Bob extends JFrame {⁞JMenuItem quit = new JMenuItem(“Quit”);quit.addActionItem(new Quitter());⁞

}

Command

Command Pattern Example

public class Quitter implements ActionListener {public void actionPerformed(ActionEvent e) { System.exit(0);}

}

public class Bob extends JFrame {⁞JMenuItem quit = new JMenuItem(“Quit”);quit.addActionItem(new Quitter());⁞

}

ConcreteCommand

Command Pattern Example

public class Quitter implements ActionListener {public void actionPerformed(ActionEvent e) { System.exit(0);}

}

public class Bob extends JFrame {⁞JMenuItem quit = new JMenuItem(“Quit”);quit.addActionListener(new Quitter());quit.doClick();⁞

}

Invoker

Command Pattern Example

public class Quitter implements ActionListener {public void actionPerformed(ActionEvent e) { System.exit(0);}

}

public class Bob extends JFrame {⁞JMenuItem quit = new JMenuItem(“Quit”);quit.addActionItem(new Quitter());⁞

}

Receiver

Delaying Gratification

Command pattern must encapsulate actions Can delay executing commands until should

act GUI adds to Queue & execute Commands in

FIFO order Enables splitting action execution &

creation In Java, sometimes see delay between cause

& effect Prevent executing more actions if code

contains bugs Even if listener throws exception, program

continues

Information Logs

Track Commands executed, by keeping a log If multiple Invokers, Commands must refer

to log Keep only one log at a time to record

order To keep this log, could pass references

everywhere Switching the log causes problems,

however

Solution: Make Log a singleton class

Keeping a Log

Several ways to log executed Commands If queued, print Command before executing Rely on Command to print self in execute() Make Invoker call store() method in Command

Which is the best choice depends on… System implementation & where changes

expected Exactly which of the details to be logged Classes most reliable coders on team were

writing

Improving Performance

Many modern CPUs contain multiple cores Complete execution unit in each core on

chip Processor executes multiple tasks

simultaneously Need to take advantage to maximize

performance Number of cores varies by processor

Single core in older or cheaper processors

Can also find dual-core, quad-core, & more

One job per core provides best performance Must write your code to scale to

available cores

Commands to the Rescue

Simple solution using the command pattern

Interface for Command already in Javapublic interface Runnable {

public void run();}

Invoker classes available as part of Java, also In your code, can get instance of this class

using Executor.newFixedThreadPool() orExecutor.newScheduledThreadPool()

How Thread Pools Work

Creates pool of threads to perform work Each of these threads execute command

at a time Executes next command after first is

completed Optimize performance creating thread

per core ConcreteCommand classes left to

write Could be any class implementing Runnable

Invoker calls run() method in instances

How Thread Pools Work

Creates pool of threads to perform work Each of these threads execute command

at a time Executes next command after first is

completed Optimize performance creating thread

per core ConcreteCommand classes left to

write Could be any class implementing Runnable

Invoker calls run() method in instances

Textbook example of Command Pattern

Thread Pool Example

public class Lin implements Runnable {public void run() { for (long num = 0; num < 50; num++) System.out.println(“Lin: ” + num);}

}public class Exp implements Runnable {public void run() { for (long num = 1; num < 250; num*=2) { System.out.println(“Exp: ” + num);}

}

Thread Pool Example

public static void main(String[] args){Runnable command1 = new Lin();Runnable command2 = new Lin();Runnable command3 = new Exp();ExecutorService pool =

Executors.newFixedThreadPool(2);

pool.execute(command1);pool.execute(command2);pool.execute(command3);

pool.shutdown();pool.awaitTermination(21,TimeUnit.DAYS);

}

Thread Pool Results

Thread pool started with 1, 2, & 3 threads:

Transaction-Based System

Databases also big users of command pattern Can easily replicate actions in normal

programs Transactions are used to make DBs

work Gather set of changes into single action Makes all changes in transactions as

single action Result either ALL changes or NO

changes made

Transaction-Based System

Transactions are just a party! Very, very hot area of research also Many organizations looking to generalize

this Example of MacroCommands in wide

use Command places individual changes into

group Apply changes when MacroCommand

executed Needs checks to ensure one macro run

at a time

For Next Class

Lab #5 due by 11:59AM next Friday Get busy restructuring code so ready for

real world Will have time in lab, but due before next

week’s lab Next lecture on Adapter Pattern (p.

235-253) Fir square peg in round hole using code;

can we do it? What does this have to do with legacy

code? No standard electrical plug; why could this

be?