1.什么是命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,最终把命令给执行掉。
使用场景:认为是命令的地方都可以使用命令模式。
2.命令模式优缺点
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。
3.典型案例
货物进出仓库,指令员给库方管理人员下达进出货物的指令,库方管理员根据指令进行货物的进出仓库。
4.代码实现
关键代码:定义三个角色:1、真正的命令执行对象(Worker) 2、命令(Order) 3、使用命令对象的入口(Treasurer)
步骤1:创建命令接口(Order)
package com.yx.demo.cmd;
/**
* Order
* 指令接口
*
* @author yx
* @date 2019/11/30 20:57
*/
public interface Order {
void execute();
}
步骤2:创建命令最终执行对象(Worker)。
package com.yx.demo.cmd;
/**
* 工人
*
* 真正命令的执行对象
*
* @author yx
* @date 2019/11/30 22:06
*/
public class Worker {
private String name = "Goods A";
private int num = 5;
public void importGoods() {
System.out.println("Goods [ Name: " + name + ",num: " + num + " ] import");
}
public void exportGood() {
System.out.println("Goods [ Name: " + name + ",num: " + num + " ] export");
}
}
步骤3:创建Order接口实体类,一个用于进货,一个用于出货。
package com.yx.demo.cmd;
/**
* ImportGoods
* 进货指令
*
* @author yx
* @date 2019/11/30 22:19
*/
public class ImportGoods implements Order {
private Worker mWorker;
public ImportGoods(Worker worker) {
this.mWorker = worker;
}
@Override
public void execute() {
mWorker.importGoods();
}
}
package com.yx.demo.cmd;
/**
* ExportGoods
* 出货指令
*
* @author yx
* @date 2019/11/30 22:17
*/郑州妇科医院 http://www.ytsgfk120.com/
public class ExportGoods implements Order {
private Worker mWorker;
public ExportGoods(Worker worker) {
this.mWorker = worker;
}
@Override
public void execute() {
mWorker.exportGood();
}
}
步骤 4 创建库房管理员类(Treasurer)。
主要处理接受指令和处理指令,供领导使用。
package com.yx.demo.cmd;
import java.util.ArrayList;
import java.util.List;
/**
* Treasurer
* 仓库管理员
* 使用命令对象的入口
*
* @author yx
* @date 2019/11/30 22:35
*/
public class Treasurer {
private List orderList = new ArrayList();
public void acceptOrder(Order order) {
orderList.add(order);
}
public void dealOrders() {
for (Order order : orderList) {
order.execute();
}
orderList.clear();
}
}
步骤5:demo演示,库房管理员接受指令和处理指令
package com.yx.demo.cmd;
/**
* CommandPatternDemo
* 测试类
*
* @author yx
* @date 2019/11/30 22:41
*/
public class CommandPatternDemo {
public static void main(String[] args) {
Worker worker = new Worker();
ImportGoods importGoods = new ImportGoods(worker);
ExportGoods exportGoods = new ExportGoods(worker);
Treasurer treasurer = new Treasurer();
treasurer.acceptOrder(importGoods);
treasurer.acceptOrder(exportGoods);
treasurer.dealOrders();
}
}
示例中:进出货物的请求,封装在ImportGoods和ExportGoods中,领导将指令需求指派给库房管理员Treasurer处理,至于Treasurer怎么处理交给哪个工人处理,领导不关心,仓库管理员进出货物找具体的工人执行指令。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。