定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
使用场景:认为是命令的地方都可以使用命令模式
实现:定义命令接口,执行者类,命令聚合执行者,定义请求发起者,聚合命令列表
优点:执行者与请求者解耦
代码示例:饭店点菜,有厨师(执行者)、客人(请求者)、服务员(通知者)
/** * 命令接口-菜单 * @author liuhao * */ public interface Order { void execute(); }
/** * 命令实现类 菜A * @author liuhao * */ public class DishA implements Order{
private Chef chef; public DishA(Chef chef) { super(); this.chef = chef; }
@Override public void execute() { chef.cookingA(); }
}
/** * 命令实现类 菜B * @author liuhao * */ public class DishB implements Order { private Chef chef; public DishB(Chef chef) { super(); this.chef = chef; } @Override public void execute() { chef.cookingB(); }
}
/** * 命令执行者-厨师 * @author liuhao * */ public class Chef { public void cookingA() { System.out.println("做菜A"); } public void cookingB() { System.out.println("做菜B"); } }
/** * 命令发起者-顾客 * @author liuhao * */ public class Customer { private List<Order> orders = new ArrayList<Order>(); public void addOrder(Order order) { orders.add(order); } public void execAll() { for (Order order : orders) { order.execute(); } } }
public class Main {
public static void main(String[] args) { Chef chef = new Chef(); DishA a = new DishA(chef); DishB b = new DishB(chef); Customer customer = new Customer(); customer.addOrder(a); customer.addOrder(b); customer.execAll(); }
}
结果: