命令模式与责任链模式有点像,但是还是不同。
- 命令模式:将多个命令只提交给一个执行该命令的对象 而职责链模式相反:只将一个请求提交给多个能执行该命令的对象
命令模式也属于行为型模式。
何时使用,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
代码:
import java.util.ArrayList;
import java.util.List;
interface Order{
//命令接口
void execute();
}
class Eat{
//请求类
private int price=10;
public void Lunch(){
System.out.println("Price:"+price+"--lunch");
}
public void Dinner(){
System.out.println("Price: "+price+"--dinner");
}
}
class EatLunch implements Order{
private Eat eat;
public EatLunch(Eat eat){
this.eat=eat;
}
public void execute() {
eat.Lunch();
}
}
class EatDinner implements Order{
private Eat eat;
public EatDinner(Eat eat){
this.eat=eat;
}
@Override
public void execute() {
eat.Dinner();
}
}
class Broker{
//命令调用类
private List<Order> orderList=new ArrayList<Order>();
public void takeOrder(Order order){
orderList.add(order);
}
public void placeOrder(){
for(Order order:orderList){
order.execute();
}
orderList.clear();
}
}
public class CommandPatternDemo {
public static void main(String[] args) {
Eat eat=new Eat();
EatLunch eatLunch=new EatLunch(eat);
EatDinner eatDinner=new EatDinner(eat);
Broker broker=new Broker();
broker.takeOrder(eatLunch);
broker.takeOrder(eatDinner);
broker.placeOrder();
}
}
输出:
Price:10--lunch
Price: 10--dinner
这种模式的缺点就是可能会增加很多具体命令类(Pass:最近头很晕,可能没睡好。。。)