设计模式——命令模式

这篇具有很好参考价值的文章主要介绍了设计模式——命令模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

命令模式

定义

将一个请求封装成一个对象,从而让你使用不同的请求吧客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
命令模式是一个高内聚的模式。

优缺点、应用场景

优点

  1. 类间解耦。调用者与接收者之间没有任何依赖关系。调用者只需要调用execute()方法即可,不需要了解哪个接收者执行。
  2. 可拓展性。
  3. 命令模式结合其他模式会更优秀。例如与责任链模式结合,实现命令族解析任务;结合模板方法模式,可以减少Command子类膨胀问题。

缺点

  1. 类的膨胀问题。如果有N个命令,则子类的数量就为N个,这可能会导致类的膨胀,需要慎重使用。

代码模拟场景

项目组有三个小组需求组、美工组、编码组,客户的每个“命令”都有可能涉及到多个组的响应,使用命令模式一方面接收客户的“命令”,另一方面根据“命令”组合出小组之间的分工。

实验小结

  1. 你永远也不知道用户到底怎么定义他的需求,每次的修改都相当于命令
  2. 如果对于每个命令都需要new来处理,那么每次都需要创建一个场景类,而且是手动的执行命令中的每个细节
  3. 命令模式要求,将一个命令中所有的细节都交给Command的实现类来做,执行命令时由唯一执行人Invoker来执行,而客户的需求只跟Invoker说明,由Invoker发布命令

命令模式

UML图

设计模式——命令模式,设计模式,设计模式,命令模式

部门抽象及部门实体

/**
 * 抽象组
 */
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 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("客户要求需求变更计划");
	}
}

/**
 * 美工组
 */
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("客户要求页面变更计划");
	}
}

/**
 * 代码组
 */
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("客户要求代码变更计划");
	}
}

命令Command抽象与实现

/**
 * 抽象命令类
 */
public abstract class Command {
	// 定义好三个组,子类可以直接使用
	protected RequirementGroup requirementGroup = new RequirementGroup();
	protected PageGroup pageGroup = new PageGroup();
	protected CodeGroup codeGroup = new CodeGroup();
	// 只有一个方法:执行
	public abstract void execute();
}

/**
 * 需求组添加需求的命令
 */
public class AddRequirementCommand extends Command {
	@Override
	public void execute() {
		super.requirementGroup.find();
		super.requirementGroup.add();
		super.requirementGroup.plan();
	}
}

/**
 * 需求组添加需求的命令
 */
public class DeletePageCommand extends Command {
	@Override
	public void execute() {
		super.pageGroup.find();
		super.pageGroup.delete();
		super.pageGroup.plan();
	}
}

执行人(实施)

/**
 * 执行者
 */
public class Invoker {
	private Command command;
	// 客户发出命令
	public Invoker setCommand(Command command) {
		this.command = command;
		// 这个地方自己加的,为了方便设置命令后执行
		return this;
	}
	// 执行客户的命令
	public void action(){
		this.command.execute();
	}
}

入口类

public class CommandMain {
	public static void main(String[] args) {
//        硬核需求();
		command();
	}

	// 命令模式
	public static void command(){
		Invoker<Command> invoker = new Invoker<>();
		// 添加一个需求
		Command addRequirementCommand = new AddRequirementCommand();
		// 设置命令,在这里需要什么命令就直接new一个Command接口的实现类即可
		Command deletePageCommand = new DeletePageCommand();
		invoker.setCommand(addRequirementCommand);     // 执行
		invoker.setCommand(deletePageCommand);
		invoker.rollback(addRequirementCommand.getClass());     // 客户要求回滚
		invoker.action();
	}

	public static void 硬核需求(){
		System.out.println("-----客户要求增加一项需求-----");
		Group requirementGroup = new RequirementGroup();
		// 找到需求组
		requirementGroup.find();
		// 添加需求
		requirementGroup.add();
		// 要求变更计划
		requirementGroup.plan();
	}
}

结果

非命令模式
设计模式——命令模式,设计模式,设计模式,命令模式

命令模式
设计模式——命令模式,设计模式,设计模式,命令模式

参考书籍

秦小波《设计模式之禅》文章来源地址https://www.toymoban.com/news/detail-552450.html

到了这里,关于设计模式——命令模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式(19)命令模式

    一、介绍: 1、定义:命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使你可以使用不同的请求对客户端进行参数化。命令模式还支持请求的排队、记录日志、撤销操作等功能。 2、组成结构: (1)命令接口(Command):定义执行命令的方法,可

    2024年02月07日
    浏览(37)
  • 设计模式-命令模式

    接受者(Receiver) 请求的实际作用对象 抽象命令(Command) 声明了执行请求的execute方法 具体命令(ConcreteCommand) 调用实际操作对象,实现execute 调用者(Invoker) 调用命令请求发送者 功能键绑定 比如遥控器的功能键,现在想要实现为功能可以自定义绑定事件,请使用命令模

    2024年02月09日
    浏览(41)
  • 设计模式—行为型模式之命令模式

    命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。 命令模式包含以下主要角色。 抽象命令类(Command)角色:声明执行命令的接口,

    2024年01月25日
    浏览(41)
  • 设计模式之命令模式【行为型模式】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博

    2024年02月01日
    浏览(41)
  • 【设计模式--行为型--命令模式】

    定义 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储,传递,调用,增加与管理。 结构 抽象命令类(Command)角色:定义命令的接口,声明执行的方法。 具体命令(Concrete Command)

    2024年02月04日
    浏览(37)
  • 设计模式行为型——命令模式

    目录 命令模式的定义      命令模式的实现 命令模式角色 命令模式类图 命令模式举例 命令模式代码实现 命令模式的特点 优点 缺点 使用场景 注意事项         命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。是对命令的封装,每一个命令都是

    2024年02月14日
    浏览(43)
  • 设计模式-命令模式(Command)

    命令模式(Command Pattern)是一种行为型设计模式,也被称为动作模式或事务模式。它的核心思想是将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化。对请求排队或记录,以及支持可撤销的操作。命令模式的主要目的是将发出请求的对象和执行请求的

    2024年04月27日
    浏览(34)
  • 【软件设计模式之命令模式】

    命令模式是一种行为设计模式,它在软件开发中扮演着特殊的角色,尤其是在处理操作请求、排队请求、记录日志,以及支持可撤销操作方面。 命令模式将请求封装成对象,从而允许使用者与接收者解耦,使用不同的请求、队列或日志来参数化其他对象。它也支持可撤销操作

    2024年02月19日
    浏览(38)
  • Java 设计模式——命令模式

    (1)日常生活中,我们出去吃饭都会遇到下面的场景: (2)命令模式是一种行为型设计模式, 它通过将请求封装为一个对象,使得可以灵活地参数化客户端对象,同时也能够将请求队列或记录日志、撤销操作等操作进行处理 。命令模式的作用在于 解耦请求发送者和接收者

    2024年02月06日
    浏览(34)
  • 设计模式之命令模式笔记

    记录下学习设计模式-命令模式的写法。JDK使用版本为1.8版本。 意图 :将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 结构 : 其中: Command声明执行操作的接口。 ConcreteCommand将一个接收者对象

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包