java设计模式5-命令模式

什么是命令模式?

从生活中这个很好理解,遥控器电视机就是一个典型的命令模式.

命令模式的概念:“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象实现二者之间的松耦合。这就是命令模式(Command Pattern)----当你彻底了解析命令模式后,在回过头来理解这句话.

为什么要用命令模式?

理解为什么要用命令模式,是学习命令模式的关键.

深入理解命令模式:

1.命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开

2.每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作

3.命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

4.命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。--因为这个特点就可以实现概念中提到的“记录、撤销/重做、事务”等处理,

5.命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联

上面这5点对命令模式进行了更深一步的解析.对理解和设计命令模式都非常有帮助.

 

/**
 * 设计一灯类,作为行为的实现者.
 */
public class Light {
    //灯的位置
    String loc="";

    public Light(String loc){
        this.loc=loc;
    }
    public void On(){
        System.out.println(loc+" On");
    }
    public void Off(){
        System.out.println(loc+" Off");
    }
}

 

/**
 * 命令的抽象接口
 * 深入理解命令模式中的第5点
 */
public interface Command {

    public void execute();
    public void undo();
}

每一个命令都对应一个类

/**
 * 开灯的命令
 * 深入理解命令模式中的第4点
 */
public class LightOffCommand implements Command{

    private Light light;

    public LightOffCommand(Light light){
        this.light=light;
    }

    @Override
    public void execute() {
        // TODO Auto-generated method stub
        light.Off();
    }

    @Override
    public void undo() {
        // TODO Auto-generated method stub

    }

}

 

/**
 * 行为请求者 的接口,就是遥控器接口
 */
public interface Control {

    public void onButton(int slot);

    public void offButton(int slot);
}
/**
 * 行为请求者的实现,控制器的实现
 * 这个也是关健
 */
public class MedoControl implements Control {

    private Command[] onCommands;
    private Command[] offCommands;
    public MedoControl(){
        onCommands = new Command[5];
        offCommands = new Command[5];
        //这是一个空命令,里面的undo方法和execute方什么都不做.
        Command noCommand = new noCommand();
        for(int i=0;i<onCommands.length;i++){
            onCommands[i]=noCommand;
            offCommands[i]=noCommand;
        }
    }
    //这是初始化这个控制器,就是这个遥控器上有那些键,这些键给他设设置成什么命令.
    //slot 表示那个键,每个键上对应什么命令
    public void setCommand(int slot,Command on,Command off){
        onCommands[slot]=on;
        offCommands[slot]=off;
    }

    @Override
    public void onButton(int slot) {
        onCommands[slot].execute();
    }

    @Override
    public void offButton(int slot) {
        onCommands[slot].execute();
    }
}
时间: 2024-09-29 10:25:27

java设计模式5-命令模式的相关文章

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

一.概述 命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求.核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法,命令模式是一种对象行为型模式. 二.使用场景 1>.系统要求请求发送者和接收者的解耦,使得调用者和接收者不直接交互: 2>.类似消息 请求/命令 队列处理:[命令装载在集合或队列中,通过遍历集合,达到命令的批量处

java设计模式之命令模式以及在java中作用

命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式的结构 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象. 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作:接收的一方收到请求,并执行操作.命令模式允许请求的一方和接收的一方独立开来,

java设计模式之命令模式

学校中.生活中.社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在.命令这一词也就在阶层中诞生.家长命令孩子,老师命令学生,领导命令小娄娄.这些都在我们的生活存在的东西,相信这一个模式学习起来也会比较简单的.这次我们就举一个领导命令员工的例子来学习命令模式. 工作中领导经常会叫(命令)你去做一些事情,但是领导并不关心你怎么做的,只需要知道你做的结果就好了.怎么做是你自己的事情,做不好就等着加班吧(开玩笑的,一般都会说自己自愿的,哈哈),做的好功劳也不好是你的,哈哈好像有点小黑暗.一般

浅谈JAVA设计模式之——命令模式(Command)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45569323 一.概述 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 二.适用性 1.抽象出待执行的动作以参数化某对象. 2.在不同的时刻指定.排列和执行请求. 3.支持取消操作. 4.支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍. 5.用构建在原语操作上的高层操作构造一个系统. 三.参与者 1.Co

用Java 8 Lambda表达式实现设计模式:命令模式

链接:http://www.importnew.com/16789.html 在这篇博客里,我将说明如何在使用Java 8 Lambda表达式的函数式编程方式时实现命令设计模式.命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化,并提供相应的操作.命令模式是一种通用编程方式,该方式基于运行时决策顺序来执行方法.模式的参与者如下: 命令 :声明用于执行操作的接口. 实体命令 :定义接收者对象和动作的绑定. 客户端 :创建实体命令实例并设置它的接收者. 调用者:

java设计模式--行为型模式--命令模式

1 命令模式 2 概述 3 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 4 5 6 适用性 7 1.抽象出待执行的动作以参数化某对象. 8 9 2.在不同的时刻指定.排列和执行请求. 10 11 3.支持取消操作. 12 13 4.支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍. 14 15 5.用构建在原语操作上的高层操作构造一个系统. 16 17 18 参与者 19 1.Command 20 声明执行操作的接口.

设计模式(6)--命令模式

关键词 :空对象 有人称为设计模式 三层调用 1. 封装调用  , 把封装带到一个全新的境界: 把方法调用(method invocation) 封装起来. 2. 命令模式可将"动作的请求者" 从"动作的执行者" 对象中解耦. 3. 当需要将发出的请求和执行请求的对象解耦的时候,使用命令模式. OO原则: (1)封装变化 (2) 多用组合,少用继承 (3)针对接口编程,不针对实现编程 (4)为交互对象之间松耦合设计而努力 (5) 类应该对扩展开放,对修改关闭 (6)

设计模式之命令模式

命令模式的核心是把方法调用封装起来,调用的对象不需要关心是如何执行的. 定义:命令模式将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也可以支持撤销操作. 先看一个例子,设计一个家电遥控器的API,可以通过遥控器发出命令来控制不同生产商生产的家电,比如关灯.开灯. 以下是一个简单的代码示例. 1 package cn.sp.test05; 2 /** 3 * 电灯类 4 * @author 2YSP 5 * 6 */ 7 public class Lig

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

浅析JAVA设计模式之工厂模式(一)

1 工厂模式简介 工厂模式的定义:简单地说,用来实例化对象,代替new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式可以动态决定将哪一个类实例化,不用先知道每次要实例化哪一个类. 工厂模式可以分一下三种形态: 简单工厂 (Simple Factory)模式:又称静态工厂模式(StaticFactory). 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory). 抽象工厂 (Abstract Factroy)模式:又称工具箱模式