public abstract class Group {
public abstract void find();
public abstract void add();
public abstract void delete();
public abstract void change();
public abstract void plan();
}
public abstract class Command {
protected RequirementGroup rg=new RequirementGroup();
protected PageGroup pg=new PageGroup();
protected CodeGroup cg=new CodeGroup();
public abstract void execute();
}
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command=command;
}
public void action(){
this.command.execute();
}
}
public class CodeGroup extends Group {
@Override
public void add() {
System.out.println("add code");
}
@Override
public void change() {
System.out.println("change code");
}
@Override
public void delete() {
System.out.println("delete code");
}
@Override
public void find() {
System.out.println("find code");
}
@Override
public void plan() {
System.out.println("plan code");
}
}
public class PageGroup extends Group {
@Override
public void add() {
System.out.println("add page");
}
@Override
public void change() {
System.out.println("change page");
}
@Override
public void delete() {
System.out.println("delete page");
}
@Override
public void find() {
System.out.println("find page");
}
@Override
public void plan() {
System.out.println("plan page");
}
}
public class RequirementGroup extends Group {
@Override
public void add() {
System.out.println("add requirement");
}
@Override
public void change() {
System.out.println("change requirement");
}
@Override
public void delete() {
System.out.println("delete requirement");
}
@Override
public void find() {
System.out.println("find requirement");
}
@Override
public void plan() {
System.out.println("plan requirement");
}
}
現在根據需要來一個一個的寫命令,非常好擴展
public class AddRequirementCommand extends Command {
/**
* 執行增加一項需求的命令
*/
@Override
public void execute() {
super.rg.find();
super.rg.add();
super.rg.plan();
}
}
public class DeletePageCommand extends Command {
/**
* 刪除頁面的命令
*/
@Override
public void execute() {
super.pg.find();
super.rg.delete();
super.rg.plan();
}
}
好了,命令已經寫好了。
如何調用呢? 直接調用這個類的execute方法不就行了嗎? 爲了更加體現依賴關係和系統設計特點(無論接受了什麼命令,都要接受和執行),調用者和接受者沒有任何依賴關係。調用者只需要調用Command抽象類的execute方法即可,不需要了解誰執行了。
public class Client {
public static void main(String[] args) {
Invoker invoker=new Invoker();
System.out.println("--------客戶要求增加一項需求-------------");
Command command = new AddRequirementCommand(); //使用早就寫好的東西
command.execute();
invoker.setCommand(command);
invoker.action();
}
}
/*高內聚
*調用者Invoker和接受者Group沒有依賴,Command容易擴展
*缺點就是如果Command子類多的話,需要N多個的子類去一個一個實現
*/
我是菜鳥,我在路上。