芜湖网站建设兼职,电商行业网站建设及维护,广州建设水务局网站,销售行业怎样做网站设计模式--行为型--命令模式 命令模式定义结构案例优缺点使用场景 命令模式
定义
将一个请求封装为一个对象#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通#xff0c;这样方便将命令对象进行存储#xff0c;传递#xff0c;调用… 设计模式--行为型--命令模式 命令模式定义结构案例优缺点使用场景 命令模式
定义
将一个请求封装为一个对象使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通这样方便将命令对象进行存储传递调用增加与管理。
结构
抽象命令类Command角色定义命令的接口声明执行的方法。具体命令Concrete Command角色具体的命令实现命令接口通常会持有接收者并调用接受者的功能来完成命令要执行的操作。接收者Receiver角色接收者真正执行命令的对象。任何一个类都可能成为一个接收者只要它能够实现命令要求实现的相应功能。请求者Invoke角色要求命令对象执行请求通常会持有命令对象可以持有很多的命令对象。这个使客户端真正出发命令并要求命令执行相应操作的地方也就是相当于使用命令对象的入口。
案例
饭店点餐顾客把订单给服务员服务员把订单给厨师厨师做菜。
服务员请求者由她向厨师发起命令厨师接收者真正执行命令的对象订单命令中包含订单 类图
/*** 抽象命令类*/
public interface Command {void execute();
}/*** 具体命令类*/
public class OrderCommand implements Command{// 持有接收者对象private SeniorChef seniorChef;private Order order;public OrderCommand(SeniorChef seniorChef, Order order) {this.seniorChef seniorChef;this.order order;}Overridepublic void execute() {System.out.println(order.getDiningTable() 卓的订单);MapString, Integer foodDir order.getFoodDir();SetString keys foodDir.keySet();for (String foodName : keys){seniorChef.makeFood(foodName,foodDir.get(foodName));}System.out.println(order.getDiningTable() 卓的饭好了---);}
}/*** 订单类*/
public class Order {// 餐桌号码private int diningTable;// 餐品及数量private MapString, Integer foodDir new HashMap();public int getDiningTable() {return diningTable;}public void setDiningTable(int diningTable) {this.diningTable diningTable;}public MapString, Integer getFoodDir() {return foodDir;}public void setFoodDir(MapString, Integer foodDir) {this.foodDir foodDir;}public void setFood(String name, int num) {foodDir.put(name, num);}
}/*** 厨师类*/
public class SeniorChef {public void makeFood(String name, int num){System.out.println(num份name);}
}/*** 服务员角色 请求者*/
public class Waitor {// 持有多个命令private ListCommand commands new ArrayList();public ListCommand getCommands() {return commands;}public void setCommands(Command command) {commands.add(command);}// 发起命令的方法public void orderUp(){System.out.println(服务员说新订单来了);for (Command command : commands) {if (command ! null){command.execute();}}}
}public class Test01 {public static void main(String[] args) {// 订单对象Order order new Order();order.setDiningTable(1);order.setFood(炒土豆丝,1);order.setFood(可乐,1);Order order1 new Order();order1.setDiningTable(2);order1.setFood(面条, 1);// 厨师对象SeniorChef seniorChef new SeniorChef();// 创建命令对象OrderCommand orderCommand new OrderCommand(seniorChef, order);OrderCommand orderCommand1 new OrderCommand(seniorChef, order1);// 创建调用者服务员Waitor waitor new Waitor();waitor.setCommands(orderCommand);waitor.setCommands(orderCommand1);// 发起命令waitor.orderUp();}
}优缺点
优点 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类满足开闭原则对扩展比较灵活。可以实现宏命令。命令模式可以与组合模式结合将多个命令装配成一个组合命令即宏命令。方便实现Undo和Redo操作。命令模式可以与备忘录模式结合实现命令的撤销与恢复。 缺点 使用命令模式可能会导致某些系统有过多的具体命令类。系统结构更加复杂。
使用场景
系统需要将请求调用者和请求接收者解耦使得调用者和接收者不直接交互。系统需要在不同的时间指定请求将请求排队和执行请求。系统需要支持命令的撤销操作和恢复操作。