`
zhangwei_david
  • 浏览: 468904 次
  • 性别: 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
分享到:
评论

相关推荐

    design-pattern-java.pdf

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

    33种JAVA设计模式DEMO

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

    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实现23种设计模式

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

    Design-pattern-Adapter-Factory-Command-Memento:Java中的Adapter&Factory&Command&Memento设计模式

    设计模式-适配器-工厂-命令-备忘录Java中的Adapter&Factory&Command&Memento设计模式GoodHealth Fitness Corporation 是一家大型健身俱乐部。 它提供最先进的设备供其成员使用。 公司维护一个会员系统,用于记录会员...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN ...

    CoreJava-DesignPattern

    CoreJava-DesignPattern 创意设计模式 -- Abstract Factory - Done -- Builder - Done -- Factory Method -- Object Pool -- Prototype - Done -- Singleton - Done 结构设计模式 -- Adapter -- Bridge -- ...

    JAVA设计模式.rar

    策略模式【STRATEGY PATTERN】 代理模式【PROXY PATTERN】 ...命令模式【COMMAND PATTERN】  装饰模式【DECORATOR PATTERN】 迭代器模式【ITERATOR PATTERN】  组合模式【COMPOSITE PATTERN】 ......

    java 设计模式

    java 设计模式 bridge CommandPattern factoryMethod simpleFactory

    设计模式_命令模式.zip

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 ...

    Java设计模式学习教程与案例源码.zip

    7. [命令模式](worthed/OriginBlog/blob/master/articles/CommandPattern.md) 8. [职责链模式](worthed/OriginBlog/blob/master/articles/ChainOfResponsibilityPattern.md) 9. [解释器模式](worthed/OriginBlog/...

    java源码解读-DesignPattern:Android源码设计模式解析与实战读书笔记源代码

    包名command_pattern表示的是命令模式的简单例子 包名decorator_pattern.example_one表示的是装饰模式的简单例子1 包名decorator_pattern.example_2表示的是装饰模式的简单例子2(人穿什么衣服的例子,比较直观的...

    23种设计模式的java实现源码

    23种设计模式的java实现源码 此目录里包括了一书中所有23种设计模式的实现(Java 版)源码 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写出(&gt;90%原创), 难免有错误的地方,希望...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    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/behavior/...

    java 设计模式资料

    附件中是java实现全部的设计模式,包含代码和工程(jbuilder工程),值得收藏. 此目录里包括了一书中所有23种设计模式的实现(Java 版)源码 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写...

    深入浅出设计模式(中文版电子版)

    5.2CommandPattern(命令模式) 179 5.2.1定义 179 5.2.2现实中的实例——餐馆订菜 180 5.2.3C#实例——简单计算器 181 5.2.4Java实例——总开关 185 5.2.5优势和缺陷 189 5.2.6应用情景 189 5.3Interpreter...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    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/behavior/...

    深入浅出设计模式(中文版)

    5.2CommandPattern(命令模式) 179 5.2.1定义 179 5.2.2现实中的实例——餐馆订菜 180 5.2.3C#实例——简单计算器 181 5.2.4Java实例——总开关 185 5.2.5优势和缺陷 189 5.2.6应用情景 189 5.3Interpreter...

    Object-Oriented-Analysis-Design:面向对象的分析和设计(JAVA语言)设计模式,Java GUI

    &gt;观察者设计模式PART3-&gt;装饰器设计模式HW02: PART1-&gt;单例设计模式PART2-&gt;迭代器设计模式PART3-&gt;状态和观察者模式PART4-&gt;代理设计模式中期: PART1-&gt;抽象工厂设计模式PART2-&gt;适配器设计模式PART3-&gt;命令设计模式PART4...

    Java命令模式.docx

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 ...

Global site tag (gtag.js) - Google Analytics