设计模式--命令模式(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

时间: 2024-12-15 06:56:33

设计模式--命令模式(Command)的相关文章

设计模式 - 命令模式(command pattern) 具体解释

命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对象, 以便使用不同的请求\队列\日志来參数化其它对象. 命令模式也能够支持撤销操作. 简单的命令模式的实现: 1. 详细的类, 每个类都有特定的方法: /** * @time 2014年6月9日 */ package command; /** * @author C.L.Wang * */ publ

设计模式 - 命令模式(command pattern) 详解

命令模式(command pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 命令模式: 将请求封装成对象, 以便使用不同的请求\队列\日志来参数化其他对象. 命令模式也支持可撤销操作. 命令模式: 调用者(Invoker); 命令(Command): 可执行方法(execute), 具体命令(Concrete Command); 接受者(Receiver): 调用命令(Set Command); 具体方法: 1. 具体对象. /** *

设计模式 - 命令模式(command pattern) 多命令 详解

命令模式(command pattern) 多命令 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 根据参数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /**

设计模式 - 命令模式(command pattern) 撤销(undo) 详解

命令模式(command pattern) 撤销(undo) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式可以用于执行撤销(undo)操作. 具体方法: 1. 对象类中需要保存状态, 如level. package command; public class CeilingFan { String loca

设计模式 - 命令模式(command pattern) 宏命令(macro command) 详解

命令模式(command pattern) 宏命令(macro command) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考: 命名模式(撤销): http://blog.csdn.net/caroline_wendy/article/details/31419101 命令模式可以执行宏命令(macro command), 即多个命令的组合操作. 具体方法:  1. 其余代码与命令(撤销)一致 2. 添加宏命令(macro command),

设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式能够用于运行撤销(undo)操作. 详细方法: 1. 对象类中须要保存状态, 如level. package command; public class CeilingFan { String lo

设计模式 - 命令模式(command pattern) 多命令 具体解释

命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 依据參数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /*

[设计模式] 命令模式 Command

Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间的解耦. 在GOF的<设计模式:可复用面向对象软件的基础>一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作.在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想,当将客户的单个请求封装成对象以后

Java设计模式-命令模式Command

定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. UML图: 角色 Command:定义命令的接口,声明执行的方法. ConcreteCommand:命令接口实现对象,是"虚"的实现:通常会持有接收者,并调用接收者的功能来完成命令要执行的操作. Receiver:接收者,真正执行命令的对象.任何类都可能成为一个接收者,

设计模式 ( 十三 ) 命令模式Command(对象行为型)

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题