声明: 本文
内容属于《Head First 设计模式》阅读笔记
,文中涉及到的知识案例等直接或间接来源于该书。《Head First 设计模式》
通过有趣的图表+文字的形式,让人自然学习设计模式,非常棒
,推荐阅读
。
命令模式概念(白话):
现有命令执行者(对象)A,A本身有一大堆可以执行的指令(即:方法),如:指令x、指令y、指令z……;还有一个命令(对象)B,B持有A,在B中有一个(或多个)触发方法,触发方法中的逻辑其实是:A对象调用A的一个或一些指令(方法),进而完成某些功能;还有命令请求者(对象)C,A与C不直接关联,而是通过B来间接关联;这样一来,当命令请求者C需要实现某个功能时,就会通知B(即:调用B的触发方法),进而通知到了B内部的对象A,(由于B对象中的触发方法,其实是对A对象的某个或某些方法的进一步封装,所以)最后由A实现了C需要的功能。
示例一个命令对象类(辅助理解):
示例一个命令请求者类(辅助理解):
案例(辅助理解):
提示: 下面给出的代码示例,只是相对关键的一部分,完整的代码可去文末链接处获取。
情景介绍:
现有一遥控器,遥控器上有一些槽,每个槽对应一个家电(如:客厅灯、厨房灯、电风扇),同时每个槽上有两个按钮分别控制对应家电的开与关(或更多按钮来调节家电的档位)。考虑到命令模式的优点是,可以将“命令请求者”与“命令执行者”解耦开来。所以这里采用命令模式来实现,那么对应的,遥控器就是“命令请求者”,各大家电的厂商就是“命令执行者”,当然这两者中间还需要有命令对象来进行关联。
-
遥控器长这样:
-
项目结构长这样:
命令接口与命令对象类:
-
命令接口:
-
灯的命令对象类:
注:上图只是一个开灯的命令类,对应的关灯的命令类与其类似。 -
风扇的命令对象类:
命令执行者:
-
客厅灯的命令执行者:
注:在上图中,开灯、关灯的共有逻辑写在AbstractLight类里面在,子类LivingRoomLight就起了个区分灯类型的作用。
注:这里只给了客厅灯,厨房灯的类似,就不给出了。 -
电风扇的命令执行者:
命令请求者:
测试一下:
测试一:
- 测试类:
- 运行主函数,程序输出:
测试二:
- 测试类:
- 运行主函数,程序输出:
命令模式学习完毕 !
^_^ 如有不当之处,欢迎指正
^_^ 参考资料
《Head First 设计模式》Eric Freeman & Elisabeth Freeman with Kathy Sierra & Bert Bates著,O’Reilly Taiwan公司译,UMLChina改编
^_^ 测试代码托管链接
https://github.com/JustryDeng…DesignPattern
^_^ 本文已经被收录进《程序员成长笔记》 ,笔者JustryDeng