`
zhangwei_david
  • 浏览: 477189 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

       命令模式(Command Pattern)是对象的行为模式,其意图是将请求封装在对象的内部。

 命令模式涉及的角色有:

  • 客户端(Client )角色:负责创建一个具体的命令,并指定命令的接受者
  • 命令(Command) 角色: 定义一个命令公共的操作接口
  • 具体命令(Concrete Command)角色:定义一个命令的接收者和行为之间的耦合。实现命令接口的公共接口,调用接收者的相应操作。
  • 请求者(Invoker)角色:负责调用命令对象执行请求。
  • 接收者(Receiver)角色:负责具体实施和执行一个请求

   示例:

         在生活只能电视机就是一个很好的命令模式的实例。 遥控器就是一个Invoker, 电视机就是一个Receiver;使用遥控器的人就是一个Client;遥控器上的按钮就是一个Concrete Command.

        假设一个电视机 有开,关,切换频道的基本功能。有一个遥控器上,有开,关按钮,还有频道1,频道2,频道3 的按钮。 首先需要将遥控器和电视机进行匹配,匹配后就可以通过遥控器控制电视机。

 

/**
 *电视机的抽象接口,定义了一个电视机的基本操作
 * @author zhangwei_david
 * @version $Id: TV.java, v 0.1 2014年11月21日 下午4:34:05 zhangwei_david Exp $
 */
public interface TV {

    /**
     * 打开电视机
     */
    public void open();

    /**
     * 关闭电视机
     */
    public void close();

    /**
     * 切换频道
     *
     * @param channel
     */
    public void change(int channel);
}

 

/**
 *具体的电视机
 * @author zhangwei_david
 * @version $Id: SonyTV.java, v 0.1 2014年11月21日 下午4:35:05 zhangwei_david Exp $
 */
public class SonyTV implements TV {

    private enum State {
        OPEN, CLOSE;
    }

    private State state = State.CLOSE;

    /**
     * @see com.cathy.demo.pattern.command.TV#open()
     */
    public void open() {
        if (state == State.CLOSE) {
            state = State.OPEN;
            System.out.println("打开电视机");
        }
    }

    /**
     * @see com.cathy.demo.pattern.command.TV#close()
     */
    public void close() {
        if (state == State.OPEN) {
            state = State.CLOSE;
            System.out.println("关闭电视机");
        }
    }

    /**
     * @see com.cathy.demo.pattern.command.TV#change(int)
     */
    public void change(int channel) {
        if (state == State.OPEN) {
            System.out.println("切换到 " + channel + " 频道");
        }
    }

}

 

/**
 *抽象的命令接口
 * @author zhangwei_david
 * @version $Id: Command.java, v 0.1 2014年11月21日 下午4:27:15 zhangwei_david Exp $
 */
public interface Command {
    /**
     * 执行命令
     */
    public void execute();
}

 

/**
 *具体的命令-打开
 * @author zhangwei_david
 * @version $Id: Open.java, v 0.1 2014年11月21日 下午4:28:37 zhangwei_david Exp $
 */
public class Open implements Command {

    /**接收者**/
    private TV tv;

    public Open(TV tv) {
        super();
        this.tv = tv;
    }

    /**
     * @see com.cathy.demo.pattern.command.Command#execute()
     */
    public void execute() {
        tv.open();
    }


}

 

/**
 *具体的命令实现-关闭
 * @author zhangwei_david
 * @version $Id: Close.java, v 0.1 2014年11月21日 下午4:29:41 zhangwei_david Exp $
 */
public class Close implements Command {

    private TV tv;

    /**
     * @see com.cathy.demo.pattern.command.Command#execute()
     */
    public void execute() {
        tv.close();
    }

    public Close(TV tv) {
        super();
        this.tv = tv;
    }

}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: Change.java, v 0.1 2014年11月21日 下午4:31:13 zhangwei_david Exp $
 */
public class Change implements Command {

    /**频道**/
    private int channel;

    /**
     * Getter method for property <tt>channel</tt>.
     *
     * @return property value of channel
     */
    public int getChannel() {
        return channel;
    }

    /**
     * Setter method for property <tt>channel</tt>.
     *
     * @param channel value to be assigned to property channel
     */
    public void setChannel(int channel) {
        this.channel = channel;
    }

    /**
     * @see com.cathy.demo.pattern.command.Command#execute()
     */
    public void execute() {
        System.out.println("切换到 " + channel + " 频道");
    }

    public Change(int channel, TV tv) {
        super();
        this.channel = channel;
    }

}

 

/**
 *请求者 -遥控器
 * @author zhangwei_david
 * @version $Id: Telecontroller.java, v 0.1 2014年11月21日 下午4:39:00 zhangwei_david Exp $
 */
public class Telecontroller {

    private Command open;

    private Command close;

    private Command one;

    private Command two;

    private Command three;

    public Telecontroller(TV tv) {
        open = new Open(tv);
        close = new Close(tv);
        one = new Change(1, tv);
        two = new Change(2, tv);
        three = new Change(3, tv);
    }

    /**
     * 打开电视机
     */
    public void open() {
        open.execute();
    }

    /**
     * 关闭电视机
     */
    public void close() {
        close.execute();
    }

    /**
     * 切换到频道1
     */
    public void one() {
        one.execute();
    }

    /**
     * 切换到频道2
     */
    public void two() {
        two.execute();
    }

    /**
     * 切换到频道3
     */
    public void three() {
        three.execute();
    }
}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: Client.java, v 0.1 2014年11月21日 下午4:40:19 zhangwei_david Exp $
 */
public class Client {
    public static void main(String[] args) {
        // 具体电视机
        SonyTV sonyTV = new SonyTV();
        // 遥控器和电视机进行配对
        Telecontroller telecontroller = new Telecontroller(sonyTV);
        // 通过遥控打开电视机
        telecontroller.open();
        // 通过遥控切换到1频道
        telecontroller.one();
        // 通过遥控切换到3频道
        telecontroller.three();
        // 通过遥控关闭电视机
        telecontroller.close();

    }
}

 

打开电视机
切换到 1 频道
切换到 3 频道
关闭电视机

 

 

 

0
0
分享到:
评论

相关推荐

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式...命令模式(Command Pattern)、装饰模式(Decorator Pattern)、迭代器模式(Iterator Pattern)、组合模式(Composite Pattern)、观察者...

    JAVA设计模式-chm版

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    java常用设计模式-命令模式

    命令模式(Command Pattern)是一种行为设计模式,它允许将请求封装为一个对象,从而使不同的请求可以使用不同的参数进行参数化,队列或日志请求,以及支持可撤销的操作。在 Java 中,命令模式的实现通常涉及一个...

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    design-pattern-java.pdf

    命令模式-Command Pattern 请求发送者与接收者解耦——命令模式(一) 请求发送者与接收者解耦——命令模式(二) 请求发送者与接收者解耦——命令模式(三) 请求发送者与接收者解耦——命令模式(四) 请求发送者...

    命令模式command pattern

    命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列请求,或者支持可撤销的操作。在Java中实现命令模式,我们可以利用面向对象编程的特性来构建系统,使得...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    13. **命令模式(Command Pattern)**:将请求封装为一个对象,使得可以使用不同的请求、队列请求、记录请求或者支持可撤销的操作。 14. **责任链模式(Chain of Responsibility Pattern)**:避免对象之间的耦合,...

    design-pattern-Java设计模式

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和标准解决方案。设计模式并不直接提供代码实现,而是提供了一种通用的语言,让开发者能够更好地理解和交流复杂的系统架构。这些...

    这是一套 Java 设计模式的集合示例-design-pattern.zip

    Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,可以提高代码的可重用性、可维护性和可扩展性。在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码...

    Java设计模式(第二版)中文版

    - **命令模式**(Command Pattern) - **迭代器模式**(Iterator Pattern) - **解释器模式**(Interpreter Pattern) - **中介者模式**(Mediator Pattern) - **备忘录模式**(Memento Pattern) - **状态...

    java设计模式ppt

    命令模式 (Command Pattern) 命令模式是一种行为型模式,将一个请求封装成一个对象,从而使你能够用不同的请求来参数化对象,对请求进行排队或记录日志,以及支持可撤销的操作。命令模式可以将请求的发送者与执行...

    设计模式java源码-design-pattern:java设计模式源代码

    这个名为"design-pattern:java设计模式源代码"的压缩包文件很可能是包含了多种Java实现的设计模式示例。 首先,我们来看看主要的设计模式分类: 1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton...

    设计模式整理代码-pattern.zip

    - 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。 - 解释器模式(Interpreter):给定一种语言,定义它的文法表示,并提供一个解释器来处理该语言...

    设计模式-COMMAND

    **命令模式(Command Pattern)** 是一种行为设计模式,它将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 在软件开发中,特别是面向对象编程语言...

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    pattern/src/behavior/command //13.6命令模式 pattern/src/behavior/memento //13.7备忘录模式 pattern/src/behavior/state //13.8状态模式 pattern/src/behavior/visitor //13.9访问者模式 pattern/src/...

    Java与模式-我修改过的源代码

    9. **命令模式**(Command Pattern):将请求封装为一个对象,以便使用不同的请求、队列请求或支持撤销操作。在Java中,常用于事件驱动系统。修改可能涉及增加新的命令或者优化命令的执行流程。 10. **桥接模式**...

    JAVA 23种设计模式(全).Design Pattern_Java模式

    总结来说,"JAVA 23种设计模式(全).Design Pattern_Java模式"这份资源是学习和掌握Java设计模式的重要工具。通过深入学习并熟练应用这些模式,开发者可以写出更高效、更易于维护的代码,同时提升个人的编程技能和...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

Global site tag (gtag.js) - Google Analytics