JAVA设计模式之【命令模式】

简介:
命令模式    为了降低耦合度,将请求的发送者和接收者解耦    发送请求的对象只需要哦知道如何发送请求,而不必知道如何完成请求    对请求排队    记录请求日志    支持撤销操作    核心在于引入命令类    角色        抽象命令类Command        具体命令类ConcreteCommand        调用者Invoker        接收者Receiver    请求的一方不必知道接收请求的一方,更不必知道请求如何被接收、执行、怎么执行、何时执行

看例子,电视遥控器,电视,人。

1.抽象命令类,或接口

package Command;

/**
 * Created by Jiqing on 2016/10/26.
 */
public interface AbstractCommand {
    public void execute();
}

2.命令接收者电视机

package Command;

/**
 * Created by Jiqing on 2016/10/26.
 */
public class Television {
    public void open() {
        System.out.println("打开电视机");
    }

    public void close() {
        System.out.println("关闭电视机");
    }

    public void changeChannel() {
        System.out.println("切换电视频道");
    }
}

3.具体命令
a.打开命令

package Command;

/**
 * Created by Jiqing on 2016/10/26.
 */
public class TVOpenCommand implements AbstractCommand{
    private Television tv;
    public TVOpenCommand() {
        tv = new Television();
    }

    public void execute() {
        tv.open();
    }
}

b.关闭命令

package Command;

/**
 * Created by Jiqing on 2016/10/26.
 */
public class TVCloseCommand implements AbstractCommand{
    private Television tv;
    public TVCloseCommand() {
        tv = new Television();
    }

    public void execute() {
        tv.close();
    }
}

c.更改频道命令

package Command;

/**
 * Created by Jiqing on 2016/10/26.
 */
public class TVChangeCommand implements AbstractCommand{
    private Television tv;
    public TVChangeCommand() {
        tv = new Television();
    }

    public void execute() {
        tv.changeChannel();
    }
}

4.命令发布者控制者,人

package Command;

/**
 * Created by Jiqing on 2016/10/26.
 */
public class Controller {
    private AbstractCommand openCommand,closeCommand,changeCommand;
    public Controller(AbstractCommand openCommand,AbstractCommand closeCommand,AbstractCommand changeCommand) {
        this.openCommand = openCommand;
        this.closeCommand = closeCommand;
        this.changeCommand = changeCommand;
    }

    public void open() {
        openCommand.execute();
    }

    public void change() {
        changeCommand.execute();
    }

    public void close() {
        closeCommand.execute();
    }
}

5.客户端

package Command;

/**
 * Created by Jiqing on 2016/10/26.
 */
public class Client {
    public static void main(String a[]) {
        AbstractCommand openCommand,closeCommand,changeCommand;

        openCommand = new TVOpenCommand();
        closeCommand = new TVCloseCommand();
        changeCommand = new TVChangeCommand();

        Controller control = new Controller(openCommand,closeCommand,changeCommand);

        control.open();
        control.close();
        control.change();
    }
}

执行结果:

打开电视机
关闭电视机
切换电视频道

再看一个撤销案例

package Command.Undo;
abstract class AbstractCommand
{
    public abstract int execute(int value);
    public abstract int undo();
}

class ConcreteCommand extends AbstractCommand
{
    private Adder adder = new Adder();
    private int value;

    public int execute(int value)
    {
        this.value=value;
        return adder.add(value);
    }

    public int undo()
    {
        return adder.add(-value);
    }
}

class CalculatorForm
{
    private AbstractCommand command;

    public void setCommand(AbstractCommand command)
    {
        this.command=command;
    }

    public void compute(int value)
    {
        int i = command.execute(value);
        System.out.println("执行运算,运算结果为:" + i);
    }

    public void undo()
    {
        int i = command.undo();
        System.out.println("执行撤销,运算结果为:" + i);
    }
}

class Adder
{
    private int num=0;

    public int add(int value)
    {
        num+=value;
        return num;
    }
}

class Client
{
    public static void main(String args[])
    {
        CalculatorForm form = new CalculatorForm();
        ConcreteCommand command = new ConcreteCommand();
        form.setCommand(command);

        form.compute(10);
        form.compute(5);
        form.compute(10);
        form.undo();
    }
}

执行结果:

执行运算,运算结果为:10
执行运算,运算结果为:15
执行运算,运算结果为:25
执行撤销,运算结果为:15

看类图



本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6002401.html,如需转载请自行联系原作者

相关文章
|
4月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
95 0
|
4月前
|
设计模式 消息中间件 Java
【设计模式】【行为型模式】命令模式(Command)
一、入门 什么是命令模式? 命令模式是一种行为设计模式,它将请求或操作封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录、撤销等操作。 命令模式的核心是将“请求”封装为独立的
161 15
|
7月前
|
设计模式 存储 算法
「全网最细 + 实战源码案例」设计模式——命令模式
命令模式(Command Pattern)是一种行为型设计模式,将请求封装成独立对象,从而解耦请求方与接收方。其核心结构包括:Command(命令接口)、ConcreteCommand(具体命令)、Receiver(接收者)和Invoker(调用者)。通过这种方式,命令的执行、撤销、排队等操作更易扩展和灵活。 适用场景: 1. 参数化对象以操作。 2. 操作放入队列或远程执行。 3. 实现回滚功能。 4. 解耦调用者与接收者。 优点: - 遵循单一职责和开闭原则。 - 支持命令组合和延迟执行。 - 可实现撤销、恢复功能。 缺点: - 增加复杂性和类数量。
203 14
「全网最细 + 实战源码案例」设计模式——命令模式
|
6月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
10月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
157 6
|
10月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
133 4
|
11月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
10月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
417 0
|
12月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
102 3
|
12月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
150 2