10-命令模式

命令模式

一、定义

将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能

命令模式的通用类图
在这里插入图片描述
Receive接收者角色是干活的角色,命令传递到这里是应该被执行的;Command命令角色,需要执行的命令都在这里声明;Invoker调用者角色,接收到命令,并执行命令。

命令模式的通用源码

  1. 通用Receiver类

    public abstract class Receiver {
    	//抽象接收者,定义每个接收者都必须完成的业务
    	public abstract void doSomething();
    }
    
  2. 具体的Receiver类

    public class ConcreteReciver1 extends Receiver{
    	//每个接收者都必须处理一定的业务逻辑
    	public void doSomething(){
    	}
    }
    
    public class ConcreteReciver2 extends Receiver{
    	//每个接收者都必须处理一定的业务逻辑
    	public void doSomething(){
    	}
    }
    
  3. 抽象的Command类

    public abstract class Command {
    	//每个命令类都必须有一个执行命令的方法
    	 public abstract void execute();
    }
    
  4. 具体的Command类

    public class ConcreteCommand1 extends Command {
    	//对哪个Receiver类进行命令处理
    	private Receiver receiver;
        
    	//构造函数传递接收者
    	public ConcreteCommand1(Receiver _receiver){
    		this.receiver = _receiver;
    	}
    	//必须实现一个命令
    	public void execute() {
            //业务处理
            this.receiver.doSomething();
    	}
    }
    
    public class ConcreteCommand2 extends Command {
        //哪个Receiver类进行命令处理
        private Receiver receiver;
        
        //构造函数传递接收者
        public ConcreteCommand2(Receiver _receiver){
        	this.receiver = _receiver;
        }
        
        //必须实现一个命令
        public void execute() {
            //业务处理
            this.receiver.doSomething();
        }
    }
    
  5. 调用者Invoker类

    public class Invoker {
        private Command command;
        //受气包,接受命令
        public void setCommand(Command _command){
        	this.command = _command;
        }
        //执行命令
        public void action(){
        	this.command.execute();
        }
    }
    
  6. 场景类

    public class Client {
        public static void main(String[] args) {
            //首先声明调用者Invoker
            Invoker invoker = new Invoker();
            //定义接收者
            Receiver receiver = new ConcreteReciver1();
            //定义一个发送给接收者的命令
            Command command = new ConcreteCommand1(receiver);
            //把命令交给调用者去执行
            invoker.setCommand(command);
            invoker.action();
        }
    }
    

二、命令模式的优点

  • 类间解耦

    调用者与接受者之间没有任何的依赖关系,调用者实现功能只需要调用Command的方法就好了,不需要了解是哪个接受者执行

  • 可扩展性

    Command的子类可以非常容易地扩展,二调用者和高层次模块的Client不产生严重的代码耦合

  • 命令模式结合其他模式会更优秀

    命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少
    Command子类的膨胀问题。

三、命令模式的缺点

如果有N个命令,Command的子类就为N个,这个类会膨胀得非常大

四、使用场景

只要是命令的地方就可以采用命令模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值