设计模式之命令模式

1.命令模式的定义(百度百科)

在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。将一组行为抽象为对象,实现二者之间的松耦合。

从上面的描述中,我们可以看出,命令模式解决的是请求和实现紧耦合的问题。

2.案例

我们模拟一个早上起床、刷牙的场景。

3.命令模式的实现

3.1定义命令抽象接口

public interface Command<T> {

    T execute();
}

3.2 定义命令接收者

public abstract class Receiver<T> implements Command<T> {

}
public class GetUpReceiver extends Receiver<String> {

    private Map<String, Object> params;

    public GetUpReceiver(Map<String, Object> params) {
        this.params = params;
    }

    @Override
    public String execute() {
        System.out.println("执行起床命令");
        return null;
    }
}
public class BrushReceiver extends Receiver<String> {

    private Map<String, Object> params;

    public BrushReceiver(Map<String, Object> params) {
        this.params = params;
    }

    @Override
    public String execute() {
        System.out.println("执行刷牙命令");
        return null;
    }
}

3.3实现起床、刷牙命令

public class GetUpCommand implements Command<String> {

    private Receiver receiver;

    public GetUpCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public String execute() {
        return (String)receiver.execute();
    }
}



public class BrushCommand implements Command<String> {

    private Receiver receiver;

    public BrushCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public String execute() {
        return (String) receiver.execute();
    }
}

3.4 定义请求对象

public class Invoker {

    private List<Command> commands = new ArrayList<>();

    public Invoker addCommand(Command command) {
        commands.add(command);
        return this;
    }

    public void executeCommand() {
        for (Command command : commands) {
            command.execute();
        }
    }

}

3.5 客户端调用

public class Client {


    public static void main(String[] args) {
        //起床
        GetUpCommand getUpCommand = new GetUpCommand(new GetUpReceiver(new HashMap<>()));
        //刷牙
        BrushCommand brushCommand = new BrushCommand(new BrushReceiver(new HashMap<>()));

        Invoker invoker = new Invoker();
        invoker.addCommand(getUpCommand)
                .addCommand(brushCommand);
        invoker.executeCommand();
    }

}

4. 命令模式总结

一般包含3个角色

  1. command:命令抽象接口
  2. receiver:命令接收者
  3. invoker:请求者,组装命令

命令模式与与策略模式的区别

  1. 策略模式强调的是达成同一目标的不同实现,比如去上班,有多种路线,但最终的目的是上班。
  2. 命令模式强调的是做不同的事情,隐藏不同的实现,比如起床、刷牙、上班等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值