美文网首页
命令模式

命令模式

作者: 潜心之力 | 来源:发表于2020-08-13 17:04 被阅读0次

    一、模式简介

    定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
    场景:当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互。当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能。当系统需要执行一组操作时,命令模式可以定义宏命令来实现该功能。当系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作时,可以将命令对象存储起来,采用备忘录模式来实现。

    • 角色结构:
    • 抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()。
    • 具体命令类(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
    • 接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
    • 调用者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

    二、模式实现

    public interface AbstractCommand { -> 抽象命令
        void command();
    }
    
    public class EnterConcreteCommand implements AbstractCommand { -> 具体命令
        @Override
        public void command() {
            TelevisionReceiver receiver = new TelevisionReceiver();
            receiver.enter();
        }
    }
    
    public class BackConcreteCommand implements AbstractCommand { -> 具体命令
        @Override
        public void command() {
            TelevisionReceiver receiver = new TelevisionReceiver();
            receiver.back();
        }
    }
    
    public class TelevisionReceiver { -> 接收者
        public void enter(){
            System.out.println("电视机收到enter的命令并执行作出回应");
        }
    
        public void back(){
            System.out.println("电视机收到back的命令并执行作出回应");
        }
    }
    
    public class RemoteControlInvoker { -> 调用者
        public void remote(AbstractCommand command){
            command.command();
        }
    }
    

    以用户创建命令通过遥控器发送给电视机,电视机解析命令后作出响应为例子,用户的想法是抽象命令,遥控器上的按键是具体命令,遥控器是调用者,电视机是接收者。

    RemoteControlInvoker invoker = new RemoteControlInvoker();
    AbstractCommand enter = new EnterConcreteCommand();
    invoker.remote(enter);
    AbstractCommand back = new BackConcreteCommand();
    invoker.remote(back);
    

    相关文章

      网友评论

          本文标题:命令模式

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