设计模式-命令模式

  1. 主要思想,将方法封装为类,重载同一个方法,实现请求者与调用者的解耦。

  2. 例子:
    Thread类。所有交给Thread的执行的类都要实现Runnable接口的run()方法,Thread类只负责执行run()方法,而不是具体类的具体方法。

  3. 代码实例

    /**
     * 需求场景,有一个遥控器,需要调用许多第三方厂家的电器的开和关功能。
     * 并且不同第三方厂家的开关函数名称不同。如何实现遥控器与家电的解耦。
     * 注意:遥控器所绑定的家电会不断变化,硬编码几乎无法维护。
     */
    /**
     * 遥控器类
     */
    public 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();
        }
    }
    
posted @ 2019-08-14 11:38  bosslv  阅读(171)  评论(0编辑  收藏  举报