java设计模式(行为型)之命令模式

第0章:简介

命令模式定义:将一个请求封装为一个对象,从而你可以用不同的请求对客户进行参数化,对请求队列或记录请求日志,以及支持可撤销操作

命令模式本质:封装请求

参考:http://chjavach.iteye.com/blog/705916 研磨设计模式(书籍),大话设计模式(书籍)

模式图:

待补充

第1章:实践

第0节:单命令模式

(1)接收命令的接口(Receiver.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 接收命令的接口,正在的执行者
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:17
 */
public interface Receiver {

    /**
     * 执行操作
     */
    public void someMethod();
}

(2)接收者A(ReceiverImplA.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 接收者A,正在的执行者
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:19
 */
public class ReceiverImplA implements Receiver {
    @Override
    public void someMethod() {
        System.out.println("接收者A收到命令并执行操作");
    }
}

(3)接收者B(ReceiverImplB.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 接收者B,正在的执行者
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:21
 */
public class ReceiverImplB implements Receiver {
    @Override
    public void someMethod() {
        System.out.println("接收者B收到命令并执行操作");
    }
}

(4)命令接口(Command.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 命令接口,单命令模式
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:12
 */
public interface Command {

    /**
     * 发命令
     */
    public void execute();
}

(5)命令实现类(CommandImpl.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 命令实现类,单命令模式
 *
 * 命令模式的定义:将一个请求封装为一个对象,从而你可以用不同的请求对客户进行参数化,对请求队列或记录请求日志,以及支持可撤销操作
 * 命令模式的本质:封装请求
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:14
 */
public class CommandImpl implements Command {

    //持有命令的接收者对象
    private Receiver receiver;

    /**
     * 构造器,传入相应的命令接收者对象
     * @param receiver
     */
    public CommandImpl(Receiver receiver){
        this.receiver = receiver;
    }

    /**
     * 发命令
     */
    @Override
    public void execute() {
        System.out.println("发命令时命令实现类的附加操作");
        //调用接收者去真正执行操作
        receiver.someMethod();
    }
}

(6)命名调用者(CommandInvoker.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 命名调用者,命令发起者
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:22
 */
public class CommandInvoker {

    //持有命令对象
    private Command command;

    /**
     * 设置命令对象
     * @param command
     */
    public void setCommand(Command command){
       this.command = command;
    }

    /**
     * 调用执行命令
     */
    public void executeCommand(){
        //调用发命令
        command.execute();
    }
}

(7)客户端测试(Client.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 客户端测试,单命令模式,每次只能执行一个命令
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:33
 */
public class Client {

    public static void main(String args[]){
        //接收者
        Receiver receiverA = new ReceiverImplA();
        Receiver receiverB = new ReceiverImplB();

        //命令对象
        Command commandA = new CommandImpl(receiverA);
        Command commandB = new CommandImpl(receiverB);

        //调用者调用命令,A和B命令每次只能调用其中一个,单命令模式
        CommandInvoker commandInvoker = new CommandInvoker();

        //设置为A命令
        commandInvoker.setCommand(commandA);
        //调用A命令
        commandInvoker.executeCommand();

        //设置为B命令
        commandInvoker.setCommand(commandB);
        //调用B命令
        commandInvoker.executeCommand();

    }
}

第1节:多命令模式(宏命令模式)

(1)接收命令的接口(Receiver.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 接收命令的接口,正在的执行者
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:17
 */
public interface Receiver {

    /**
     * 执行操作
     */
    public void someMethod();
}

(2)接收者A(ReceiverImplA.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 接收者A,正在的执行者
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:19
 */
public class ReceiverImplA implements Receiver {
    @Override
    public void someMethod() {
        System.out.println("接收者A收到命令并执行操作");
    }
}

(3)接收者B(ReceiverImplB.java)

package com.mcc.core.designPattern.behavior.command.singleCommand;

/**
 * 接收者B,正在的执行者
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:21
 */
public class ReceiverImplB implements Receiver {
    @Override
    public void someMethod() {
        System.out.println("接收者B收到命令并执行操作");
    }
}

(4)命令接口(Command.java)

package com.mcc.core.designPattern.behavior.command.multiCommand;

/**
 * 命令接口,多命令模式
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:12
 */
public interface Command {

    /**
     * 发命令
     */
    public void execute();
}

(5)命令实现类A(CommandImplA.java)

package com.mcc.core.designPattern.behavior.command.multiCommand;

/**
 * 命令实现类A
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:48
 */
public class CommandImplA implements Command {

    //持有命令的接收者对象
    private Receiver receiver;

    /**
     * 构造器,传入相应的命令接收者对象
     * @param receiver
     */
    public CommandImplA(Receiver receiver){
        this.receiver = receiver;
    }

    /**
     * 发命令
     */
    @Override
    public void execute() {
        System.out.println("发命令时命令实现类的附加操作");
        //调用接收者去真正执行操作
        receiver.someMethod();
    }
}

(6)命令实现类B(CommandImplB.java)

package com.mcc.core.designPattern.behavior.command.multiCommand;

/**
 * 命令实现类B
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:48
 */
public class CommandImplB implements Command {

    //持有命令的接收者对象
    private Receiver receiver;

    /**
     * 构造器,传入相应的命令接收者对象
     * @param receiver
     */
    public CommandImplB(Receiver receiver){
        this.receiver = receiver;
    }

    /**
     * 发命令
     */
    @Override
    public void execute() {
        System.out.println("发命令时命令实现类的附加操作");
        //调用接收者去真正执行操作
        receiver.someMethod();
    }
}

(7)多命令对象(MultiCommandImpl.java)

package com.mcc.core.designPattern.behavior.command.multiCommand;

import java.util.ArrayList;
import java.util.Collection;

/**
 * 多命令对象,也叫宏命令对象,用来管理所有命令
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:51
 */
public class MultiCommandImpl implements Command {

    //持有多个命令对象
    private Collection<Command> commands = new ArrayList<Command>();

    /**
     * 注册命令
     * @param command
     */
    public void addCommand(Command command){
        commands.add(command);
    }

    /**
     * 发命令,多条命令的总控
     */
    @Override
    public void execute() {
        for(Command command : commands){
            //发命令
            command.execute();
        }
    }
}

(8)宏命令调用者(MultiCommandInvoker.java)

package com.mcc.core.designPattern.behavior.command.multiCommand;

/**
 * 宏命令调用者
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  上午11:59
 */
public class MultiCommandInvoker {

    //持有宏命令
    private MultiCommandImpl multiCommand = new MultiCommandImpl();

    /**
     * 调用执行命令
     */
    public void executeCommand(){
        //接收者
        Receiver receiverA = new ReceiverImplA();
        Receiver receiverB = new ReceiverImplB();

        //命令对象
        Command commandA = new CommandImplA(receiverA);
        Command commandB = new CommandImplB(receiverB);

        //注册命令
        multiCommand.addCommand(commandA);
        multiCommand.addCommand(commandB);

        //调用宏命令
        multiCommand.execute();
    }
}

(9)客户端测试(Client.java)

package com.mcc.core.designPattern.behavior.command.multiCommand;

/**
 * 客户端测试
 *
 * @author <a href="mailto:417877417@qq.com">menergy</a>
 *         DateTime: 14-3-16  下午12:04
 */
public class Client {

    public static void main(String args[]){

        //调用者调用宏命令
        MultiCommandInvoker multiCommandInvoker  = new MultiCommandInvoker();
        multiCommandInvoker.executeCommand();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值