zoukankan      html  css  js  c++  java
  • JAVA设计模式之:命令模式

    *通常情况下:行为请求者与实现者通常呈现一种高度耦合状态。有时要对行为进行变更处理处理。高度耦合方式就显得不合适。


    * 将行为请求者与行为实现者解耦,将一组行为抽象为对象。实现二者之间的松耦合。

    这就是命令模式(Command Pattern)。
    * 命令模式通常由这几部分组成:命令接口,详细命令(实现命令接口),接受命令的对像,命令控制器等组成。


    * 模式的优势:
    1.减少对象之间的耦合度。
    2.新的命令能够非常easy地增加到系统中及设计一个组合命令。
    4.实现调用同样方法来实现不同的功能。
    模式的不足之处:
    每个命令都要设计一个详细的类,命令较多的话,会导致类比較多,系统变得庞大,命令模式的使用效率可能减少。

    /**
     * 运行命令的接口
     * @description:
     * @date 2016-1-19 上午10:26:04
     */
    public interface OrderImpl {
        void execute();//运行方法
    }
    /**
     * 详细的命令:开空调命令
     * @description:
     * @date 2016-1-19 上午10:28:18
     */
    public class OnOrder implements OrderImpl {
        private AirCondition air;
        public OnOrder(AirCondition light) {
            this.air = light;
        }
        @Override
        public void execute() {
            air.open();
        }
    }
    /**
     * 详细的命令:关空调命令
     * @description:
     * @author ldm
     * @date 2016-1-19 上午10:28:51
     */
    public class OffOrder implements OrderImpl {
        private AirCondition light;
        public OffOrder(AirCondition light) {
            this.light = light;
        }
        @Override
        public void execute() {
            light.close();
        }
    }
    /**
     * 详细命令:调节风速
     * @description:
     * @date 2016-1-19 上午11:04:50
     */
    public class ChangeSpeedOrder implements OrderImpl {
        private AirCondition myTv;
        private int channel;
    
        public ChangeSpeedOrder(AirCondition tv, int channel) {
            myTv = tv;
            this.channel = channel;
        }
    
        public void execute() {
            myTv.updateWind(channel);
        }
    }
    /**
     * 命令控制器。相当于是遥控器:控制空调的开关。调节风速等
     * @description:
     * @date 2016-1-19 上午10:57:43
     */
    public class Control {
        private OrderImpl onOrder; // 开
        private OrderImpl offOrder;// 关
        private OrderImpl updateChannel;// 调节风速
    
        public Control(OrderImpl onOrder, OrderImpl offOrder, OrderImpl updateChannel) {
            this.onOrder = onOrder;
            this.offOrder = offOrder;
            this.updateChannel = updateChannel;
    
        }
    
        public void turnOn() {
            onOrder.execute();
        }
    
        public void turnOff() {
            offOrder.execute();
        }
    
        public void changeChannel() {
            updateChannel.execute();
        }
    }
    /**
     * 命令接收者:空调为例
     * @description:
     * @date 2016-1-19 上午10:52:38
     */
    public class AirCondition {
        public int currentChannel = 0;//当前风速档
    
        public void open() {
            System.out.println("打开空调!");
        }
    
        public void close() {
            System.out.println("关闭空调。");
        }
    
        public void updateWind(int channel) {
            this.currentChannel = channel;
            System.out.println("更换空调风速档位:" + channel);
        }
    }
    public class Test {
    
        public static void main(String[] args) {
            // 命令接收者 (空调)
            AirCondition myAir = new AirCondition();
            // 开空调命令
            OnOrder on = new OnOrder(myAir);
            // 关空调命令
            OnOrder off = new OnOrder(myAir);
            // 换风速命令
            ChangeSpeedOrder speed = new ChangeSpeedOrder(myAir, 2);
            // 命令控制对象
            Control control = new Control(on, off, speed);
            // 开机
            control.turnOn();
            // 切换频道
            control.changeChannel();
            // 关机
            control.turnOff();
        }
    }

    測试结果:
    打开空调!


    更换空调风速档位:2
    打开空调。

  • 相关阅读:
    concurrent模块
    gevent模块
    Python中的线程
    2019.10.22 用TCP实现服务端并发接收
    Python中的进程
    进程和线程
    网络编程常用模块及方法
    [UOJ #222][NOI2016]区间(线段树)
    [BZOJ 4873][SHOI&SXOI2017]寿司餐厅(最大权闭合子图)
    [BZOJ 3751][NOIP2014]解方程(哈希)
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7301049.html
Copyright © 2011-2022 走看看