设计模式-命令模式

Posted bosslv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-命令模式相关的知识,希望对你有一定的参考价值。

  1. 主要思想,将方法封装为类,重载同一个方法,实现请求者与调用者的解耦。
  2. 例子:
    Thread类。所有交给Thread的执行的类都要实现Runnable接口的run()方法,Thread类只负责执行run()方法,而不是具体类的具体方法。
  3. 代码实例

    /**
     * 需求场景,有一个遥控器,需要调用许多第三方厂家的电器的开和关功能。
     * 并且不同第三方厂家的开关函数名称不同。如何实现遥控器与家电的解耦。
     * 注意:遥控器所绑定的家电会不断变化,硬编码几乎无法维护。
     */
    /**
     * 遥控器类
     */
    class Controller 
    
        private Command[] commands;
    
        public void setCommands(Command[] commands) 
            this.commands = commands;
        
    
        public void invoke() 
            for (Command command : commands) 
                command.open();
                command.close();
            
        
    
        // 遥控器测试
        public static void main(String[] args) 
            Controller controller = new Controller();
    
            TVCommand tvCommand = new TVCommand();
            tvCommand.setTV(new TV());
            FanCommand fanCommand = new FanCommand();
            fanCommand.setFan(new Fan());
    
            Command[] commands = new Command[2];
            commands[0] = tvCommand;
            commands[1] = fanCommand;
    
            controller.setCommands(commands);
            controller.invoke();
        
    
    
    /**
     * 第三方家电,电视
     */
    class TV 
        public void on() 
            System.out.println("打开电视");
        
        public void off() 
            System.out.println("关闭电视");
        
    
    
    /**
     * 第三方家电,电扇
     */
    class Fan 
        public void turnOn() 
            System.out.println("打开电扇");
        
        public void turnOff() 
            System.out.println("关闭电扇");
        
    
    
    /**
     * 命令模式,将方法封装为类
     */
    interface Command 
        void open();
        void close();
    
    
    /**
     * 方法封装,关键
     */
    class TVCommand implements Command 
    
        private TV tv;
    
        public void setTV(TV tv) 
            this.tv = tv;
        
    
        @Override
        public void open() 
            tv.on();
        
    
        @Override
        public void close() 
            tv.off();
        
    
    
    class FanCommand implements Command 
    
        private Fan fan;
    
        public void setFan(Fan fan) 
            this.fan = fan;
        
    
        @Override
        public void open() 
            fan.turnOn();
        
    
        @Override
        public void close() 
            fan.turnOff();
        
    

以上是关于设计模式-命令模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式:命令模式——命令模式扩展之队列请求

设计模式:命令模式——命令模式扩展之日志请求

vim模式与模式切换vim命令模式

设计模式----命令模式

设计模式(二十二)---命令模式

vi常用命令