命令模式

作者: Stephenwish | 来源:发表于2020-08-03 23:02 被阅读0次
    首先一个请求对象,暂时命名为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();
        }
    }
    

    相关文章

      网友评论

        本文标题:命令模式

        本文链接:https://www.haomeiwen.com/subject/tquprktx.html