设计模式之命令模式的学习思考

来源:互联网 发布:守望先锋性能数据 ping 编辑:程序博客网 时间:2024/05/17 00:12

命令模式与责任链模式有点像,但是还是不同。

  • 命令模式:将多个命令只提交给一个执行该命令的对象 而职责链模式相反:只将一个请求提交给多个能执行该命令的对象

命令模式也属于行为型模式。

何时使用,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

代码:

    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--lunchPrice: 10--dinner

这种模式的缺点就是可能会增加很多具体命令类(Pass:最近头很晕,可能没睡好。。。)

原创粉丝点击