首页 > 编程语言 > 详细

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

时间:2014-11-22 02:28:58      阅读:326      评论:0      收藏:0      [点我收藏+]

???????命令模式(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 频道
关闭电视机

?

?

?

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

原文:http://zhangwei-david.iteye.com/blog/2159020

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!