题目

使用组合命令模式实现多功能开关,让用户进行设置,可以同时控制教室的所有灯的开和关,并能控制风扇、空凋、多媒体投影仪设备的开和关。

思路

在之前的命令模式学习中,通常是对一种设备进行不同类型的操作,例如open\close

这时需要对多种不同设备进行相同的两种命令,就需要对各种设备进行抽象,抽象类Device, 各种设备则是Device的具体子类,Device通过两个操作接口,open,close。 而命令的抽象类为 Command,openCommand、closeCommand则是其具体子类,在实例化open/closeCommand时则传入Device参数,让Command与Device进行绑定,比如生成空调的开命令: openCommand(airCleaner);

题目中“同时控制所有灯”,这就表示一个Command可以操作多个灯Device,这时可以使用组合模式,额外新增 Device的一个具体子类 DevicePackage, 用于将多个Device组合在一起形成一个逻辑整体

在对DevicePackage进行close时,则对里面所有Device进行close操作, 控制所有灯的Command则与DevicePackage进行绑定

​最终Client使用的遥控器Controller,则需要设置 灯package、风扇、空调、多媒体的open/closeCommand 成员, 并且提供诸如 openAirCleaner、CloseAllLights…之类的操作

最终类图

代码实现 : java

package hah;import java.util.ArrayList;public class Pro {public static void main(String[] args) {DevicePackage allLights; // 所有灯设备的集合Device light, light2, blower, airCleaner, Multimedia;// 初始化设备allLights = new DevicePackage();light = new Light();light2 = new Light();blower = new Blower();airCleaner = new airCleaner();Multimedia = new Multimedia();allLights.addDevice(light);allLights.addDevice(light2);// 初始化命令Command lightsOpenCommand, lightsCloseCommand, blowerOpenCommand, blowerCloseCommand, airOpenCommand,airCloseCommand, multiOpenCommand, multiCloseCommand;lightsOpenCommand = new DeviceOpenCommand(allLights);lightsCloseCommand = new DeviceCloseCommand(allLights);blowerOpenCommand = new DeviceOpenCommand(blower);blowerCloseCommand = new DeviceCloseCommand(blower);airOpenCommand = new DeviceOpenCommand(airCleaner);airCloseCommand = new DeviceCloseCommand(airCleaner);multiOpenCommand = new DeviceOpenCommand(Multimedia);multiCloseCommand = new DeviceCloseCommand(Multimedia);// 命令集成为多功能遥控Controller controller = new Controller(lightsOpenCommand, lightsCloseCommand, blowerOpenCommand,blowerCloseCommand, airOpenCommand, airCloseCommand, multiOpenCommand, multiCloseCommand);controller.openAllLights();controller.openBlower();controller.openMulti();controller.openAirCleaner();controller.closeAllLights();controller.closeBlower();controller.closeMulti();controller.closeAirCleaner();}
}class Controller {private Command lightsOpenCommand, lightsCloseCommand, blowerOpenCommand, blowerCloseCommand, airOpenCommand,airCloseCommand, multiOpenCommand, multiCloseCommand;public Controller(Command lightsOpenCommand, Command lightsCloseCommand, Command blowerOpenCommand,Command blowerCloseCommand, Command airOpenCommand, Command airCloseCommand, Command multiOpenCommand,Command multiCloseCommand) {this.lightsOpenCommand = lightsOpenCommand;this.lightsCloseCommand = lightsCloseCommand;this.blowerOpenCommand = blowerOpenCommand;this.blowerCloseCommand = blowerCloseCommand;this.airCloseCommand = airCloseCommand;this.airOpenCommand = airOpenCommand;this.multiCloseCommand = multiCloseCommand;this.multiOpenCommand = multiOpenCommand;}public void openAllLights() {lightsOpenCommand.execute();}public void closeAllLights() {lightsCloseCommand.execute();}public void openBlower() {blowerOpenCommand.execute();}public void closeBlower() {blowerCloseCommand.execute();}public void openAirCleaner() {airOpenCommand.execute();}public void closeAirCleaner() {airCloseCommand.execute();}public void openMulti() {multiOpenCommand.execute();}public void closeMulti() {multiCloseCommand.execute();}
}abstract class Command {protected Device device;public abstract void execute();
}class DeviceOpenCommand extends Command {public DeviceOpenCommand(Device device) {this.device = device;}@Overridepublic void execute() {device.open();}}class DeviceCloseCommand extends Command {public DeviceCloseCommand(Device device) {this.device = device;}@Overridepublic void execute() {device.close();}}abstract class Device {public abstract void close();public abstract void open();
}class DevicePackage extends Device {private ArrayList<Device> list = new ArrayList<Device>();public void addDevice(Device device) {list.add(device);}public void removeDevice(Device device) {list.remove(device);}@Overridepublic void close() {int index = 1;for (Device device : list) {System.out.print(index + "号");device.close();index++;}}@Overridepublic void open() {int index = 1;for (Device device : list) {System.out.print(index + "号");device.open();index++;}}}class airCleaner extends Device {@Overridepublic void close() {System.out.println("空调关了");}@Overridepublic void open() {System.out.println("空调开了");}}class Multimedia extends Device {@Overridepublic void close() {System.out.println("多媒体关了");}@Overridepublic void open() {System.out.println("多媒体开了");}}class Blower extends Device {@Overridepublic void close() {System.out.println("风扇关了");}@Overridepublic void open() {System.out.println("风扇开了");}}class Light extends Device {@Overridepublic void close() {System.out.println("灯关了");}@Overridepublic void open() {System.out.println("灯开了");}}

运行结果:

1号灯开了
2号灯开了
风扇开了
多媒体开了
空调开了
1号灯关了
2号灯关了
风扇关了
多媒体关了
空调关了

设计模式-命令模式和组合模式的综合应用相关推荐

  1. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...

  2. 设计模式C++实现(7)——外观模式、组合模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最 ...

  3. 设计模式笔记九:组合模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 组合模式(Composite Pattern) 又叫部分整体模式,是用于 ...

  4. 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式

    第十六章:无尽加班何时休--状态模式 状态模式 :   优点: 缺点: 所使用的项目是:工作状态 功能: 界面: 设计思路: 收获: 附: 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出 ...

  5. 【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)

    目录 一.组合模式 1. 什么是组合模式 2. 组合模式案例 二.桥接模式 1. 什么是桥接模式 2. 桥接模式案例 一.组合模式 1. 什么是组合模式 Composite Pattern,组合模式, ...

  6. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  7. 设计模式之结构型模式:适配器模式、桥接模式、组合模式、装饰器模式、代理模式、

    文章目录 什么是结构型模式 适配模式 适配器的数据结构 适配器的实现 缺省适配器 适配器优缺点 适配器模式的使用环境 桥接模式 桥接模式数据结构 桥接模式的实现 桥接模式和适配器模式的联用 桥接模式的 ...

  8. 设计模式十二之组合模式

    设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...

  9. 设计模式-外观模式与组合模式

    1. 外观模式 顾名思义,外观模式就是说将这个类的内部执行流程都进行了封装,程序员只能够"外部"接口进行操作,而具体的执行过程并不可见.比如我们写的C++代码在生成可执行文件的过程 ...

  10. 《Head First 设计模式》读书笔记——组合模式

    承接上篇博客,我们需要修改所有的菜单,以满足可以添加子菜单,但是我们由于已经把整个项目的框架搭好了,不可能重新实现菜单,所以我们只能修改,那么我们需要做些什么呢? 树形结构,可以容纳菜单.子菜单和菜单 ...

最新文章

  1. vue 怎么全局到入常量_午后躺椅上看关于Vue的20点
  2. scala(3):class和object,trait的区别
  3. 如何读取jar包外的properties和log4j.properties等配置文件
  4. 在Linux上挂载Windows共享文件夹,如何开机自动挂载(mount)
  5. php MySQL快速入门_PHP 连接 MySQL
  6. 论文中地层岩性和岩组描述总结
  7. tc溜溜865手机投屏卡_溜溜 TC Games 官网_专题
  8. 05-类--+-号使用
  9. MapReduce:Job性能调优总结
  10. python人脸检测与微信小程序_python+requests对app和微信小程序进行接口测试
  11. 架构设计文档规范文档
  12. 核方法(kernel method)的主要思想
  13. Android-JNI开发系列《十》实践利用libjpeg-turbo完美压缩图片不失真
  14. Baxter实战 (二)ubuntu14.04安装Baxter Workstation
  15. python - 安装/解释器/变量
  16. 2003 服务器自动重启设置,Win2003定时自动重启的完美方案
  17. 吴昊品工程级别软件项目 Round 1 —— 吴昊教你玩字幕
  18. 转行学IT,你真的准备好了吗?
  19. Qt学习总结之QTableWidget表格填充
  20. canvas之-------水滴扩散特效

热门文章

  1. 编程初学者应该先学C++、Java还是Python?
  2. GlobalMapper20把地形数据(tif)转为可打印的STL格式模型
  3. 滴滴重磅开源跨平台统一MVVM框架Chameleon
  4. iOS 使用UIBezierPath类实现随手画画板
  5. map在循环删除时的正确操作
  6. 解决报错404“Not Found”
  7. Bowtie2生成linux的动态链接库.so文件
  8. Halcon工具之轮廓线
  9. SQL CREATE INDEX (mysql 创建索引)语句
  10. C++ char*转LPCWSTR