java设计模式之命令模式

java设计模式参考文章:
Java设计模式实战23种设计模式介绍以及在Java中的实现Java设计模式 Java经典设计模式之五大创建型模式


## 定义 ##

  • 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

## 代码举例 ##

模拟对电视机的操作有开机、关机命令

/**
 * @author bwx
 * @date 2017/11/29
 * 执行命令的接口
 */
public interface Command {
    void execute();
}
/**
 * @author bwx
 * @date 2017/11/29
 * 命令接收者Receiver
 */
public class Tv {
    public void turnOn() {
        System.out.println("The televisino is on.");
    }

    public void turnOff() {
        System.out.println("The television is off.");
    }
}

/**
 * @author bwx
 * @date 2017/11/29
 * 开机命令ConcreteCommand
 */
public class CommandOn implements Command {
    private Tv myTv;

    public CommandOn(Tv tv) {
        myTv = tv;
    }

    public void execute() {
        myTv.turnOn();
    }
}

/**
 * @author bwx
 * @date 2017/11/29
 * 关机命令
 */
public class CommandOff implements Command {
    private Tv myTv;

    public CommandOff(Tv tv) {
        myTv = tv;
    }

    public void execute() {
        myTv.turnOff();
    }
}
/**
 * @author bwx
 * @date 2017/11/29
 * 可以看作是遥控器Invoker
 */
public class Control {
    private Command onCommand, offCommand;

    public Control(Command on, Command off) {
        onCommand = on;
        offCommand = off;
    }

    public void turnOn() {
        onCommand.execute();
    }

    public void turnOff() {
        offCommand.execute();
    }
}
/**
 * @author bwx
 * @date 2017/11/29
 * 命令模式
 */
public class Main {
    public static void main(String[] args) {
        // 命令接收者ReceiverTv
        Tv myTv = new Tv();
        // 开机命令ConcreteCommond
        CommandOn on = new CommandOn(myTv);
        // 关机命令ConcreteCommond
        CommandOff off = new CommandOff(myTv);
        // 命令控制对象Invoker
        Control control = new Control(on, off);
        // 开机
        control.turnOn();
        // 关机
        control.turnOff();
    }
}

## 优点 ##

  • 在命令模式中,请求者(Invoker)不直接与接受者(Receiver)交互,及请求者(Invoker)不包含接受者(Receiver)的引用,因此彻底消除了彼此间的耦合。
  • 命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有具体命令和接收者,新增加的调用者就可以使用已有的具体命令。
  • 由于请求者的请求被封装到具体的命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。
  • 使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值