设计模式研究

命令模式

2020-08-03  本文已影响0人  Stephenwish
首先一个请求对象,暂时命名为invoke,发出请求,而这个请求用Command来表示,receiver表示接受者,收到消息可以执行,代码表示如下
public class Invoker {
    //长官发出命令
    private Command command;

    public Invoker(Command command) {
        this.command = command;
    }
}
public interface  Command {
    //命令对象本体
     void execute();
}
public class Receiver {

    //执行操作
    public  void doit(){
        System.err.println("do it.....");
    }
    //撤销操作
    public  void undo(){
        System.err.println("undo it.....");
    }
}
命令模式,四个字可以看出依据命令来行事,命令是多个的,所以实现多个命令
public class OrderFruit implements Command{
    private Receiver receiver;
    @Override
    public void execute() {
        receiver.doit();
    }
}


public class OrderDrink implements Command{
    private Receiver receiver;
    @Override
    public void execute() {
        receiver.doit();
    }
}
上面命令的受体都是同一个对象,改动下不同的命令为不同受体,可以抽象一个类,在继承或者实现,其实本质都没有变化
//对Recriver 类进行幻化
public class FruitReceiver {

    //执行操作
    public  void orderFruit(){
        System.err.println("do it.....order fruit");
    }
    //撤销操作
    public  void undo(){
        System.err.println("undo it..... cancal fruit");
    }
}
public class DrinkReceiver {

    //执行操作
    public  void orderFruit(){
        System.err.println("do it.....order drink");
    }
    //撤销操作
    public  void undo(){
        System.err.println("undo it..... cancal drink");
    }
}

相对的改变命令Command受体对象
public class OrderDrink implements Command{
    private DrinkReceiver receiver;
    @Override
    public void execute() {
        receiver.orderDrink();
    }
}

public class OrderFruit implements Command{
    private FruitReceiver receiver;


    @Override
    public void execute() {
        receiver.orderFruit();
    }
}

public class CancelFruit implements Command{
    private FruitReceiver receiver;

    public CancelFruit(FruitReceiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.undoFruit();
    }
}



public class CancelDrink implements Command{
    private DrinkReceiver receiver;

    public CancelDrink(DrinkReceiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.undoDrink();
    }
}
改造下发请求的人,网上很多写法,能发出命令就可以了
ublic class Invoker {
    //命令收集者
    private List<Command> commands=new ArrayList<>();

    public void addCommand(Command command){
        commands.add(command);
    }

    public void execute(){
        //把命令记录打一遍
        for (Command command : commands) {
            command.execute();
        }
    }
}
设置场景类验证
public class Client {
    public static void main(String[] args) {
        DrinkReceiver drinkReceiver = new DrinkReceiver();//卖水人
        FruitReceiver fruitReceiver = new FruitReceiver();//卖水果人

        Invoker invoker = new Invoker();//把命令收集起来执行
        OrderDrink orderDrink = new OrderDrink(drinkReceiver);//买水
        OrderFruit orderFruit = new OrderFruit(fruitReceiver);//买水果
        invoker.addCommand(orderDrink);
        invoker.addCommand(orderFruit);
        //太贵了,我又不想买了
        CancelDrink cancelDrink = new CancelDrink(drinkReceiver);
        CancelFruit cancelFruit = new CancelFruit(fruitReceiver);
        invoker.addCommand(cancelDrink);
        invoker.addCommand(cancelFruit);

        invoker.execute();
    }
}
上一篇下一篇

猜你喜欢

热点阅读