背景:以项目组为例子讲述命令模式。
第一步,几个项目组
package com.teng.pattern.abs;
/**
* 项目组抽象类
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public abstract class Group {
/**
* 找到
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午4:52:28
*/
public abstract void find();
/**
* 增加
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午4:52:32
*/
public abstract void add();
/**
* 删除
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午4:52:34
*/
public abstract void delete();
/**
* 改变
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午4:52:37
*/
public abstract void change();
/**
* 计划
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午4:52:39
*/
public abstract void plan();
}
项目组的实现:
package com.teng.pattern.impl;
import com.teng.pattern.abs.Group;
/**
* 需求组
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class RequirementGroup extends Group {
@Override
public void find() {
System.out.println("客户找到需求组。。。");
}
@Override
public void add() {
System.out.println("客户增加一项需求。。。");
}
@Override
public void delete() {
System.out.println("客户删除一项需求。。。");
}
@Override
public void change() {
System.out.println("客户改变一项需求。。。");
}
@Override
public void plan() {
System.out.println("客户要需求变更计划。。。");
}
}
package com.teng.pattern.impl;
import com.teng.pattern.abs.Group;
/**
* 美工组
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class PageGroup extends Group {
@Override
public void find() {
System.out.println("客户找到美工组。。。");
}
@Override
public void add() {
System.out.println("客户要求增加一个页面。。。");
}
@Override
public void delete() {
System.out.println("客户要求删除一个页面。。。");
}
@Override
public void change() {
System.out.println("客户要求改变一个页面。。。");
}
@Override
public void plan() {
System.out.println("客户要求给出页面变更计划。。。");
}
}
package com.teng.pattern.impl;
import com.teng.pattern.abs.Group;
/**
* 代码组
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class CodeGroup extends Group {
@Override
public void find() {
System.out.println("客户找到代码组。。。");
}
@Override
public void add() {
System.out.println("客户要增加一项功能。。。");
}
@Override
public void delete() {
System.out.println("客户要删除一项功能。。。");
}
@Override
public void change() {
System.out.println("客户要改变一项功能。。。");
}
@Override
public void plan() {
System.out.println("客户要代码变更计划。。。");
}
}
第二步,命令类
package com.teng.pattern.impl;
/**
* 命令类
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public abstract class Command {
//需求组
protected RequirementGroup rg = new RequirementGroup();
//美工组
protected PageGroup pg = new PageGroup();
//代码组
protected CodeGroup cg = new CodeGroup();
/**
* 执行
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午5:07:48
*/
public abstract void execute();
}
命令类的实现:
package com.teng.pattern.impl;
/**
* 命令:增加一项新需求
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class AddRequirementCommand extends Command {
@Override
public void execute() {
//找到需求组
super.rg.find();
//增加一份需求
super.rg.add();
//增加一个页面
super.pg.add();
//增加一个功能
super.cg.add();
//给出一份需求计划
super.rg.plan();
}
}
package com.teng.pattern.impl;
/**
* 命令:删除一个页面
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class DeletePageCommand extends Command {
@Override
public void execute() {
//找到项目组
super.pg.find();
//删除一个页面
super.pg.delete();
//给出一个删除页面计划
super.pg.plan();
}
}
第三步,定义一个接头人
package com.teng.pattern.impl;
/**
* 接头人
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Invoker {
//什么命令
private Command command;
/**
* 客户发出命令
* @since 1.0
* @param command
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午5:17:49
*/
public void setCommand(Command command){
this.command = command;
}
/**
* 执行客户命令
* @since 1.0
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午5:18:28
*/
public void execute(){
this.command.execute();
}
}
package com.teng.pattern.impl;
/**
* 客户找接头人
* <br>创建日期:2016年7月3日
* <br><b>Copyright 2016 tengxiang All Rights Reserved</b>
* @author tengxiang
* @since 1.0
* @version 1.0
*/
public class Client {
/**
* 主方法
* @since 1.0
* @param args
* <br><b>作者: @author tengxiang</b>
* <br>创建时间:2016年7月3日 下午5:19:55
*/
public static void main(String[] args) {
Invoker invoker = new Invoker();
System.out.println("用户要求增加一项新需求------------------");
Command command = new AddRequirementCommand();
//System.out.println("用户要求删除一个页面------------------");
//Command command = new DeletePageCommand();
invoker.setCommand(command);
invoker.execute();
}
}
客户不用知道有谁修改,他不需要知道,高内聚的要求体现出来了,这就是命令模式。
Receiver角色:这个就是干活的角色,命令传递到这里是应该被执行的,具体到上面的例子中就是Group的三个实现类;
Command角色:就是命令,需要我执行的所有命令都在这里声明;
Invoker角色:调用者,接受到命令,并执行命令,例子中我这里项目经理就是这个角色;
命令模式比较简单,但是在项目中使用是非常频繁的,封装性非常好,因为它把请求方(Invoker)和执行方(Receiver)分开了,扩展性也有很好的保障。