《您的设计模式》(CBF4LIFE)之“命令模式”【整理】

本文通过项目组实例介绍命令模式,展示了如何将请求封装成对象,从而让参数化对象执行不同的请求,支持可撤销操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:以项目组为例子讲述命令模式。

 

第一步,几个项目组

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分开了,扩展性也有很好的保障。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值