设计模式-行为型模式-命令模式

设计模式-行为型模式-命令模式

基础

以一个MIS系统为栗子

MIS 管理信息系统(Management Information System,MIS)是一个以人为主导的,利用计算机硬件、软件和网络设备,进行信息的收集、传递、存储、加工、整理的系统,以提高组织的经营效率。

代码如下

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{
	// 客户要求需求进行更改
	public void find(){
		
	}
	// 客户要求增加需求
	public void add(){
	}
	// 客户要求修改需求
	public void change(){
	}
	// 客户要求删除需求
	public void delete(){
	}
	// 客户要求给出变更计划
	public void plan(){
	}
}
// 美工组
public class PageGroup extends Group{
	// 找到美工组
	public void find(){
	}
	// 客户要求增加页面
	public void add(){
	}
	// 客户要求对现有界面修改
	public void change(){
	}
	// 客户要求删除页面
	public void delete(){
	}
	// 给出计划
	public void plan(){
	}
}
// 代码组
public class CodeGroup extends Group {
	// 客户要求过去谈
	public void find(){
	}
	// 客户要求增加功能
	public void add(){
	}
	// 客户要求修改功能
	public void change(){
	}
	// 客户要求删除功能
	public void delete(){
	}
	// 客户要求变更计划
	public void plan(){
	}
}

最后书写场景类

// 场景类
public class Client{
	public static void main(String[] args){
		// 客户找到需求要求谈需求进行修改
		Grop rg = new RequirementGroup();
		// 找到需求组
		rg.find();
		// 增加需求组
		rg.add();
		// 变更计划
		rg.plan();
	}
}

此时客户要求多一个界面

public class Client {
	public static void main(String[] args){
		Group pg = new PangeGroup();
		// 找到需求组
		pg.find();
		// 删除需求组
		pg.delete();
		// 需求变更
		pg.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 AddRequirementCommand extends  Command{
	// 增加一项需求命令
	public void execute(){
		// 找到需求组
		super.rg.find();
		// 增加一份需求
		super.rg.add();
		// 给出计划
		super.rg.plan();
	}
}

增加删除页面的命令

public class DeletePageCommand extends Command{
	public void execute(){
		// 找到页面组
		super.pg.find();
		// 删除页面
		super.rg.delete();
		// 给出计划
		super.rg.plan();
	}
}

最后再将这也命令封装,成一个负责人

public class invoker {
	// 命令
	private Command command;
	// 客户发出命令
	public void setCommand(Command command){
		this.command = command;
	}
	// 客户自行命令
	public void action(){
		this.command.execute();
	}
}

最后场景类如下

public class Client{
	public static void main(String[] args){
		// 定义接头人
		invoker xiaoSan = new Invoker();	// 接头人
		// 客户增加需求
		// 客户下命令
		Command command = new AddRequirementCommand();
		// 街头人收到命令
		xiaoSan.setCommand(command);
		// 街头人执行命令
		xiaoSan.action();
	}
}

继续更改

由于负责人的抽象类中声明了所有的,所以可以分离

代码如下

public abstract class Command {
	// 定义子类全局共享变量
	protected final Receiver receiver;
	// 实现类名需要接收
	public Command(Receiver _receiver){
		this.receiver = _receiver;
	}
	// 每个命令需要有执行
	public abstract void execute();
}

然后在Command中声明接收者。

通过构造函数指定

public class ConcreteCommand1 extends Command{
	// 声明自己默认接收者
	public ConcreteCommand1(){
		super(new ConcreteReciver1());
	}
	// 设置新的接受
	public ConcreteCommand1(Receiver _receiver){
		super(_receiver);
	}
	// 处理
	public void execute(){
		super.receiver.doSomething();
	}
}
// 声明场景
public class Client{
	public static void main(String[] args){
		invoker invoker = new invoker();
		// 定义要发送的命令
		Command command = new ConcreteCommand1();
		invoker.setCommand(command);
		invoker.action();
	}
}

总结

将需求封装成命令,然后再负责人当中封装,最后,需要的时候,直接调用负责人,将命令传入进去即可。

www.iming.info

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏喵了个咪的博客空间

zephir-(1)开篇介绍

#zephir-开篇介绍# ? ##前言## 先在这里感谢各位zephir开源技术提供者 笔者在学习phalcon的过程中了解到,phalcon2.x版本通过了...

3809
来自专栏拂晓风起

Flash本地传递大数据,图片数据,localconnection 超出大小,超出限制 bitmapdata

1344
来自专栏张坤的专栏

基于Http原理实现Android的图片上传和表单提交

Java的HttpURLConnection没有这么简单的封装形式,需要完整的Request Payload模拟,用起来相对不方便,不过这样能够对表单提交的原理...

2.6K0
来自专栏前端架构与工程

不仅仅是复制粘贴 - 聊聊前端脚手架

许多团队在制定前端工程方案时会加入脚手架模块。虽然不同的团队对工程化的理解和实施有所差异,但是对于脚手架的定位基本是一致的:创建项目初始文件。这是一条看起来十分...

2146
来自专栏CSDN技术头条

【问底】徐汉彬:PHP7和HHVM的性能之争

【导读】徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设。最近,PHP7...

2395
来自专栏跨界架构师

如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码:

1283
来自专栏小程序·云开发专栏

你不知道的Node.js性能优化

仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升,因为几乎任何新版本的 Node.js 都会比老版本性能更好,为什么?

8.4K5
来自专栏csxiaoyao

USTC高级软件工程课程学习心得

38410
来自专栏Crossin的编程教室

【我问Crossin】学会 Python 离成为一名程序员还差多远?

1 运行代码时报错:SyntaxError :invalid syntax Crossin: SyntaxError 为语法错误,新手常见的问题可能有: 忘记在...

2815
来自专栏Kirito的技术分享

一个DDD指导下的实体类设计案例

终于开通原创功能了,大家以后可以在文章下方留言了,欢迎交流。 1 前言 项目开发中的工具类代码总是随着项目发展逐渐变大,在公司诸多的公用代码中,笔者发现了一个...

3857

扫码关注云+社区

领取腾讯云代金券