I have this two classes that implements Command (using a command pattern), one is the create sheet:
public class CommandCreateSheet implements Command {
private Workbook workbook;
private String sheetName;
public CommandCreateSheet(Workbook workbook, String workSheetName) {
this.workbook = workbook;
this.sheetName = workSheetName;
}
@Override
public void execute() {
this.workbook.addSheet(this.sheetName);
}
@Override
public void undo() {
this.workbook.removeSheet(this.sheetName);
}
}
and the other is the delete:
public class CommandDeleteSheet implements Command {
private Workbook workbook;
private String sheetName;
public CommandDeleteSheet(Workbook workbook, String workSheetName) {
this.workbook = workbook;
this.sheetName = workSheetName;
}
@Override
public void execute() {
this.workbook.removeSheet(this.sheetName);
}
@Override
public void undo() {
this.workbook.addSheet(this.sheetName);
}
}
How can I avoid this duplicate code ?
Thanks!!
You could create an intermediate abstract class that both commands implement.
public abstract class AbstactSheetCommand implements Command
{
private Workbook workbook;
private String sheetName;
protected AbstractSheetCommand(Workbook workbook, String workSheetName)
{
this.workbook = workbook;
this.sheetName = workSheetName;
}
public abstract void execute();
public abstract void undo();
}
And then your subclasses would be much smaller:
public class CommandCreateSheet extends AbstractSheetCommand
{
public CommandCreateSheet(Workbook workbook, String workSheetName)
{
super(workbook, workSheetName);
}
@Override
public void execute() { this.workbook.addSheet(this.sheetName); }
@Override
public void undo() { this.workbook.removeSheet(this.sheetName);}
}
public class CommandDeleteSheet extends AbstractSheetCommand
{
public CommandDeleteSheet(Workbook workbook, String workSheetName)
{
super(workbook, workSheetName);
}
@Override
public void execute() { this.workbook.removeSheet(this.sheetName); }
@Override
public void undo() { this.workbook.addSheet(this.sheetName); }
}
The nice thing about doing it this way is that you can easily add new commands that are in the same "category" (so to speak) that have more specific functionality.
public class CommandRenameSheet extends AbstractSheetCommand
{
private String newWorkSheetName;
public CommandDeleteSheet(Workbook workbook, String oldWorkSheetName, String newWorkSheetName)
{
super(workbook, oldWorkSheetName);
this.newWorkSheetName = newWorkSheetName;
}
@Override
public void execute()
{ this.workbook.renameSheet(this.sheetName, newWorkSheetName); }
@Override
public void undo()
{ this.workbook.renameSheet(newWorkSheet, this.sheetName); }
}