设计模式--命令模式(Command)

简介: 基本概念:   Command模式也叫命令模式 ,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了。 命令模式的几个角色: Command: 抽象命令类 ConcreteCommand: 具体命令类 Invoker: 调用者 Receiver: 接收者 Client:客户类 命令模式的优缺点:   优点 1. 降低了系统耦合度 2. 新的命令可以很容易添加到系统中去。

基本概念: 

 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更新
设计模式虽然增加了类的数量和复杂度,但是使得结构更加清晰,更加高扩展,低冗余。
 
命令模式定义:
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,对请求队列或者记录请求日志,以及支持可撤销的操作。
 
相关文章
|
4月前
|
设计模式 UED
二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
|
11天前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
16 1
|
1月前
|
设计模式 存储 Java
【设计模式】命令模式
【设计模式】命令模式
|
3月前
|
设计模式 Java
设计模式-命令模式
设计模式-命令模式
33 1
|
3月前
|
设计模式 Java
设计模式-命令模式(Command)
设计模式-命令模式(Command)
32 0
|
3月前
|
设计模式 存储 Java
Java设计模式-命令模式
命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储、传递、调用、增加与管理。 也就是将发送者、接收者和调用命令封装成独立的对象,来供客户端调用。属于行为模式的一种。
29 1
Java设计模式-命令模式
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——06命令模式
Golang设计模式——06命令模式
20 0
|
3月前
|
设计模式 存储 前端开发
【设计模式】之命令模式
命令模式是一种非常有用的设计模式,在前端开发中经常用于管理和执行操作。它通过将操作封装成对象,并将其作为参数传递、存储或记录,实现了优雅地管理和执行操作。通过使用命令模式,我们可以提高代码的可维护性和可扩展性。然而,在应用命令模式时需要权衡其带来的优缺点,并根据具体情况进行选择。
39 0
|
3月前
|
设计模式 存储 算法
【设计模式】命令模式
欢迎来到【设计模式】系列博客,今天我们将探讨其中一种重要的设计模式——命令模式。设计模式是软件开发中解决常见问题的最佳实践,而命令模式则是其中一种非常实用的设计模式,它可以帮助我们更好地组织和管理请求或命令。在本篇博客中,我们将详细介绍命令模式的定义、特点、使用场景以及实现方式。通过具体的案例和实践,我们将深入了解命令模式在实际项目中的应用和优势。同时,我们还将分享一些注意事项和最佳实践,以帮助您更好地理解和应用命令模式。
54 1
【设计模式】命令模式
|
4月前
|
设计模式 调度
二十三种设计模式全面解析-解密命令模式:掌握控制权的设计艺术
二十三种设计模式全面解析-解密命令模式:掌握控制权的设计艺术