美文网首页Java设计模式
java设计模式之命令模式

java设计模式之命令模式

作者: 我有一只喵喵 | 来源:发表于2019-03-20 10:58 被阅读3次

    一、命令模式概念

    在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象实现二者之间的松耦合。这就是命令模式(Command Pattern)。

    二、模式结构

    • Command

    定义命令的接口,声明一系列执行的方法。比如:运行、撤销、停止开始

    • ConcreteCommand

    对Command接口进行实现,内部持有接收者Receiver对象(正在命令的执行者),调用接收者的功能来完成命令要执行的操作

    • Receiver

    接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

    • Invoker

    命令调用者。要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

    • Client

    创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。

    三、类图结构概览

    类图结构.png

    四、通过餐厅叫餐服务进行举例实现

    • Command
    public interface Command {
        void cooking();
    }
    
    • ConcreteCommand
    public class ConcreteCommand implements Command{
    
        private Chef chef;
        
        public OrderImpl(Chef chef){
            this.chef = chef;
        }
    
        public void cooking(){
            chef.cooking();
        }
    }
    
    • Chef(相当于Receiver,命名真正执行者)
    //厨师统一接口
    public interface Chef {
    
        void cooking();
    }
    
    //分别做不同菜种的厨师
    public class 鸡蛋炒饭厨师 implements  Chef {
    
       public void cooking(){
           System.out.println("我在做鸡蛋炒饭");
       }
    }
    
    public class 西红柿炒饭厨师 implements  Chef {
    
        public void cooking(){
            System.out.println("我在做西红柿炒饭");
        }
    }
    
    • 命令请求者Invoker
    public class Invoker{
       private Command command;
    
       public Invoker(Command command){
          this.command = command;
       }
       public void cooking(){
           command.cooking();
       }
    }
    
    

    -Client

    
    public class Client{
        
        public void cooking(Chef chef){
            Commond commond = new ConcreteCommand(chef);
            Invoker invoker = new Invoker(commond);
            invoker.cooking();
        }
    
    
    }
    

    五、命令模式的作用

    • 降低耦合度,将请求的发送者和接收者解耦。发送请求的对象只需要哦知道如何发送请求,而不必知道如何完成请求
    • 新的命令可以很容易地加入到系统中。
    • 可以比较容易地设计一个组合命令。
    • 调用同一方法实现不同的功能

    相关文章

      网友评论

        本文标题:java设计模式之命令模式

        本文链接:https://www.haomeiwen.com/subject/wabamqtx.html