zoukankan      html  css  js  c++  java
  • 设计模式--命令模式(Command)

    基本概念: 

     Command模式也叫命令模式 ,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了

    命令模式的几个角色:

    Command: 抽象命令类

    ConcreteCommand: 具体命令类

    Invoker: 调用者

    Receiver: 接收者

    Client:客户类

    命令模式的优缺点:

     

    优点

    1. 降低了系统耦合度

    2. 新的命令可以很容易添加到系统中去。

    缺点

    使用命令模式可能会导致某些系统有过多的具体命令类。

    Traders.java

    package com.soyoungboy.command1;
    public class Traders {
        /**
         * @Title: sailMineralWater
         * @Description: TODO(卖矿泉水)
         * @param 设定文件
         * @return void 返回类型
         * @throws
         */
        public void sailMineralWater() {
            System.out.println("卖矿泉水");
        }
        
        /**
         * @Title: sailIceBlackTea
         * @Description: TODO(卖冰紅茶)
         * @param 设定文件
         * @return void 返回类型
         * @throws
         */
        public void sailIceBlackTea() {
            System.out.println("卖冰紅茶");
        }
    }
    抽象命令类:Command.java
    /**
     * @ClassName: Command
     * @Description: TODO(抽象命令类)
     */
    public abstract class Command {
        private Traders traders;
        
        public Command(Traders traders) {
            this.traders = traders;
        }
        
        /**
         * @return 返回 traders
         **/
        public Traders getTraders() {
            return traders;
        }
        
        /**
         * @param traders 要设置的 traders
         */
        public void setTraders(Traders traders) {
            this.traders = traders;
        }
        
        public abstract void sail();
        
    }
    具体命令类1 MineralWaterCommand.java
    package com.soyoungboy.command1;
    /**
     * 
     * @ClassName: MineralWaterCommand
     * @Description: TODO(具体命令类 --販賣礦泉水) 
     */
    public class MineralWaterCommand extends Command {
        public MineralWaterCommand(Traders traders) {
            super(traders);
        }
        @Override
        public void sail() {
          this.getTraders().sailMineralWater();
        }
         
    }
    具体命令类2:IceBlackTeaCommand.java
    1. package com.soyoungboy.command1;
      /**
       * 
       * @ClassName: IceBlackTeaCommand
       * @Description: TODO(具体命令类 --販賣冰紅茶) 
       */
      public class IceBlackTeaCommand extends Command {
          
          public IceBlackTeaCommand(Traders traders) {
              super(traders);
          }
          
          @Override
          public void sail() {
              this.getTraders().sailIceBlackTea();
          }
          
      }
    2. 接收类:Cashier.java
    package com.soyoungboy.command1;
    import java.util.ArrayList;
    /**
     * @ClassName: Cashier
     * @Description: TODO(接收者 -- 收銀員類)
     */
    public class Cashier {
        public ArrayList<Command> drinks = new ArrayList<Command>();
        
        /**
         * @Title: addDrinks
         * @Description: TODO(购买各种饮料)
         * @param @param command 设定文件
         * @return void 返回类型
         * @throws
         */
        public void addDrinks(Command command) {
            drinks.add(command);
        }
        
        /**
         * @Title: removeDrinks
         * @Description: TODO(不要某種飲料)
         * @param @param command 设定文件
         * @return void 返回类型
         * @throws
         */
        public void removeDrinks(Command command) {
            drinks.remove(command);
        }
        
        /**
         * @Title: sail
         * @Description: TODO(售卖各自的饮料)
         * @param 设定文件
         * @return void 返回类型
         * @throws
         */
        public void sail() {
            for (Command drink : drinks) {
                drink.sail();
            }
        }
        
    }
    客户类即测试类:
    package com.soyoungboy.command1;
    public class Test {
        
        public static void main(String[] args) {
            Cashier cashier = new Cashier();
            Traders traders = new Traders();
            MineralWaterCommand mineralWaterCommand = new MineralWaterCommand(traders);
            IceBlackTeaCommand iceBlackTeaCommand = new IceBlackTeaCommand(traders);
           //来瓶冰红茶和矿泉水
            cashier.addDrinks(mineralWaterCommand);
            cashier.addDrinks(iceBlackTeaCommand);
            cashier.sail();
            System.out.println("----------------");
            //再来瓶冰红茶
            cashier.addDrinks(iceBlackTeaCommand);
            cashier.sail();
            System.out.println("----------------");
            //不要一瓶矿泉水了
            cashier.removeDrinks(mineralWaterCommand);
            cashier.sail();
        }
        
    }
    测试结果:
    卖矿泉水
    卖冰紅茶
    ----------------
    卖矿泉水
    卖冰紅茶
    卖冰紅茶
    ----------------
    卖冰紅茶
    卖冰紅茶
     
    android中的使用:
    Thread, Runnable中使用命令模式:
    http://www.cnblogs.com/qianxudetianxia/archive/2011/08/13/2135478.html

    2015年12月19日22:35:46更新
    设计模式虽然增加了类的数量和复杂度,但是使得结构更加清晰,更加高扩展,低冗余。
     
    命令模式定义:
    将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,对请求队列或者记录请求日志,以及支持可撤销的操作。
     
  • 相关阅读:
    大的FIbonacci数列_Java求法
    HDU1134_Game of Connections 卡特兰数
    oracle中查询锁表
    SpringBoot之使用Druid连接池以及SQL监控和spring监控
    用vue封装插件并发布到npm
    vue 预览 Excel 表格
    vue + elementUI 表格 底部 合计总数
    springboot项目中实现访问druid内置监控页面
    解决Elementui eltable合计 showsummary不显示,样式混乱问题
    Druid连接池:慢查询监控
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/4853974.html
Copyright © 2011-2022 走看看