命令模式

转载:https://blog.youkuaiyun.com/qq_20143059/article/details/102724279

定义:请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能

优点:1.调用者角色与接收者角色之间没有任何依赖关系,松耦合。

           2.Command可像其他的对象一样被操纵和扩展,可以增加和修改。可以装配成组合命令

           3从而客户端发出的请求可以在被处理之前都存放在Invoker类的容器中,可以在这个类中对请求排序,筛选,类似于aop

缺点:1.使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用

使用场景:1.在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理

                   2.队列

引申:1.命令模式结合其他模式会更优秀:命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少 Command子类的膨胀问题。

类图:


Receiver 要执行的方法

代码

Receiver类

class Receiver{
    void auxiliary() {
        System.out.println("滚去辅助");
    }
    void fightWild() {
        System.out.println("滚去打野");
    }
    void hangUp() {
        System.out.println("滚去挂机");
    }
}


Command (固定写法)

public interface Command {
    /**
     * @MethodName execute
     * @Descrition 命令执行。命令执行之前和之后可做自己想要的操作
     * @Param []
     * @return void
     */
    void execute();
}


ConcreteCommand(固定写法 实现接口 去调用接受者的方法)

public class ConcreteCommandA implements Command{
 
    private Receiver receiver;//持有行为执行者的引用
 
    public ConcreteCommandA(Receiver receiver) {
        this.receiver = receiver;
    }
 
    @Override
    public void execute() {
        receiver.auxiliary();
    }
}


public class ConcreteCommandB implements Command{
 
    private Receiver receiver;//持有行为执行者的引用
 
    public ConcreteCommandB(Receiver receiver) {
        this.receiver = receiver;
    }
 
    @Override
    public void execute() {
        receiver.fightWild();
    }
}


Invoker(个人理解如同队列 将Command临时放入放入)

public class Invoker {
    private Command command;//持有命令类的引用
 
    public Invoker(Command command) {
        this.command = command;
    }
 
    //get set方法
 
    /**
     * @MethodName toMakeIt
     * @Descrition 执行请求
     * @Param []
     * @return void
     */
    public void toMakeIt(){
        command.execute();
    }
}


调用

public class Client {
    public static void main(String[] args) {
        //生成队列
        Invoker  invoker = new Invoker();
        Command commandA = new ConcreteCommandA(new Receiver())
        invoker.setCommand(commandA);
        invoker.toMakeIt();
        Command commandB = new ConcreteCommandA(new Receiver())
        invoker.setCommand(commandB );
        invoker.toMakeIt();
 
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值