概要:
该文章参考了《设计模式之禅》一书及一些前辈的博客文章
1.该文章阐述了命令模式的基础原理及示例代码;
2.该文章适合初学设计模式的技术人员研习;
3.该文章有许多不足之处,请各位大咖指正,喷子绕道;
正文:
命令模式:高内聚的模式,将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能
1.命令模式示例代码实现:
命令角色 类:
package com.csdn;
/**
* 抽象 命令角色 类
* @author Administrator
*
*/
public abstract class Command {
//子类直接使用
protected RequirementGroup rg = new RequirementGroup();
protected PageGroup pg = new PageGroup();
protected CodeGroup cg = new CodeGroup();
public abstract void execute();
}
package com.csdn;
/**
* 增加需求命令
* @author Administrator
*
*/
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.csdn;
/**
* 删除页面回滚命令
* @author Administrator
*
*/
public class CancelDeletePageCommand extends Command{
@Override
public void execute() {
super.rg.rollBack();
}
}
接收角色 类:
package com.csdn;
/**
* 抽象 接收角色 类
* @author Administrator
*
*/
public interface Group {
//找到组
public void find();
//提出增加
public void add();
//提出删除
public void delete();
//提出修改
public void change();
//给出计划
public void plan();
//根据日志进行回滚
public void rollBack();
}
package com.csdn;
/**
* 需求组,具体接收者
* @author Administrator
*
*/
public class RequirementGroup implements 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("需求组给出需求变更计划..");
}
@Override
public void rollBack() {
System.out.println("跟需求组提出撤回需求..");
}
}
package com.csdn;
/**
* UI组,具体接收者
* @author Administrator
*
*/
public class PageGroup implements Group{
@Override
public void find() {
System.out.println("找到UI组..");
}
@Override
public void add() {
System.out.println("跟UI组提出增加页面..");
}
@Override
public void delete() {
System.out.println("跟UI组提出删除页面..");
}
@Override
public void change() {
System.out.println("跟UI组提出变更页面..");
}
@Override
public void plan() {
System.out.println("UI组给出页面变更计划..");
}
@Override
public void rollBack() {
System.out.println("跟UI组提出撤回页面..");
}
}
package com.csdn;
/**
* 代码组,具体接收者
* @author Administrator
*
*/
public class CodeGroup implements 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("代码组给出功能变更计划..");
}
@Override
public void rollBack() {
System.out.println("跟代码组提出撤回功能..");
}
}
调用角色 类:
package com.csdn;
/**
* 抽象 调用角色 类
* @author Administrator
*
*/
public class Invoker {
private Command command;
public void setCommand(Command _command){
this.command = _command;
}
public void action(){
this.command.execute();
}
}
模拟场景:
package com.csdn;
/**
* 模拟场景
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
//创建调用者
Invoker csdn = new Invoker();
//提出增加需求命令
Command addRequirement = new AddRequirementCommand();
//传达命令
csdn.setCommand(addRequirement);
//执行命令
csdn.action();
System.out.println("<----------->");
//提出删除页面回滚命令
Command cancel = new CancelDeletePageCommand();
//传达命令
csdn.setCommand(cancel);
//执行命令
csdn.action();
}
}
输出:
找到需求组..
跟需求组提出增加需求..
跟UI组提出增加页面..
跟代码组提出增加功能..
需求组给出需求变更计划..
<----------->
跟需求组提出撤回需求..
注:
a:命令模式中有三个角色:接收者角色,命令角色,调用者角色
b:命令模式将请求方和执行方分开,将请求的具体处理方式进行封装,用户只要发出请求,不需要知道具体的处理步骤就可以得到想要的答案,扩展性也有很好保障