《读_Head_First_有感》_“命令模式”
前言:[TOC]
前沿技术一直在迭代,有一种东西是不会更新的,那就是设计模式的思想。 可以来学习学习设计模式的思维,巧妙设计!
使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能,quartz最经典!
1.官方话语
概述 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
六大原则: 单一职责原则 (Single ResponsiBility Principle) 概括:应该有且仅有一个原因引起类的变更
里氏替换原则(liskov Substitution Principle ) 概括:基类出现的地方,子类一定可以出现
依赖倒转原则(Depndece Inversion Principle) 概括:针对接口编程,依赖于抽象而不是具体
接口隔离原则(Interface Segregation Principle) 概括:使用多个隔离的接口,比使用单个接口好 (细分接口,降低耦合)
迪米特法则 (Demeter Principle) 概括:实体应当尽量少的与其他类发生互相作用,使得系统功能模块相对独立
开闭原则(Open Close Principle) 概括: 对扩展开放,对修改关闭
合成复用原则 (Composite Reuse Principle) 概括:尽量使用合成/聚合的方式,少用继承
个人话语
概述 设计模式在代码层级中,是让你在某种业务场景刚开始设计时,能让未来的相关
需求扩展
极为方便的一个思想。简单的说,在一开始设计好,扩展是很方便的,设计模式就是这个
功劳者
。对于我们本来就懒的开发人员来说,这是
求之不得
的。六大原则 而对于六大原则,简单过一下就行,不用刻意理解,如果你会了
面向对象和设计模式的使用
,自然就遵循了。今日主题
【《读_Head_First_有感》_“命令模式”】
命令模式: 将请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提命令的撤销和恢复功能
场景: 认为是命令的地方就可以采用命令模式,例如,在GUI开发中,一个按钮的点击是一个命令,可以采用命令模式;模拟DOS命令的时候,当然也要采用命令模式;触发-反馈机制的处理等。等。
概述: 代码如下
'命令全部'代码
package top.huey.designpattern.command;
/**
* @author huey
* @Description : 命令接口
* @Date Created in 2018/8/21 14:36
*/
public interface Command {
/**
* @author huey
* @Description : 接受者具体执行 联想到了quartz中的execute
* @Date Created in 2018/8/21 14:37
*/
public void execute();
/**
* @author huey
* @Description : 撤销命令
* @Date Created in 2018/8/21 14:44
*/
public void undo();
}package top.huey.designpattern.command;
/**
* @author huey
* @Description : 空命令什么也不做
* @Date Created in 2018/8/21 15:07
*/
public class NoCommand implements Command {
/**
* @author huey
* @Description : 接受者具体执行 联想到了quartz中的execute
* @Date Created in 2018/8/21 14:37
*/
@Override
public void execute() {}/**
* @author huey
* @Description : 撤销命令
* @Date Created in 2018/8/21 14:44
*/
@Override
public void undo() {}
}package top.huey.designpattern.command;
/**
* @author huey
* @Description : 灯关命令
* @Date Created in 2018/8/21 14:59
*/
public class OffCommand implements Command {private Light light;
public OffCommand(Light light) {
this.light = light;
}/**
* @author huey
* @Description : 接受者具体执行 联想到了quartz中的execute
* @Date Created in 2018/8/21 14:37
*/
@Override
public void execute() {
light.off();
}/**
* @author huey
* @Description : 撤销命令
* @Date Created in 2018/8/21 14:44
*/
@Override
public void undo() {
light.on();
//反义 模拟
}
}package top.huey.designpattern.command;
/**
* @author huey
* @Description : 灯开命令
* @Date Created in 2018/8/21 14:59
*/
public class OnCommand implements Command {private Light light;
public OnCommand(Light light) {
this.light = light;
}/**
* @author huey
* @Description : 接受者具体执行 联想到了quartz中的execute
* @Date Created in 2018/8/21 14:37
*/
@Override
public void execute() {
light.on();
}/**
* @author huey
* @Description : 撤销命令
* @Date Created in 2018/8/21 14:44
*/
@Override
public void undo() {
light.off();
}
}package top.huey.designpattern.command;
/**
* @author huey
* @Description : 具体行为对象
* @Date Created in 2018/8/21 14:47
*/
public class Light {public void off(){
System.out.println("light off");
}public void on(){
System.out.println("light on");
}
}package top.huey.designpattern.command;
/**
* @author huey
* @Description : 间接调用命令的execute方法
* @Date Created in 2018/8/21 14:58
*/
public class RemoteCtrl {/**
* 存储对象
*/
private Command[] onCommands;
private Command[] offCommands;
Command undoCommand;
//撤销补充/**
* 设置容量
*/
private static final int CAPACITY = 10;
/**
* 初始化
*/
public RemoteCtrl() {
onCommands = new Command[CAPACITY];
offCommands = new Command[CAPACITY];
NoCommand noCommand = new NoCommand();
for (int i = 0;
i < CAPACITY;
i++) {
onCommands[i] = noCommand;
offCommands[i] = noCommand;
}
undoCommand = new NoCommand();
////开始无撤销
}/**
* 在哪个位置,设置什么命令//宏观看一个off可以替换成list 多个off执行
*/
public void setCommands(int index, OffCommand offCommand, OnCommand onCommand) {
offCommands[index] = offCommand;
onCommands[index] = onCommand;
}/**
* 执行索引出某个on命令
*/
public void onButtonCommand(int index) {
onCommands[index].execute();
undoCommand = onCommands[index];
//记录上次命令
}/**
* 执行索引出某个off命令
*/
public void offButtonCommand(int index) {
offCommands[index].execute();
undoCommand = offCommands[index];
//记录上次命令
}public void undoButtonCommand() {
undoCommand.undo();
}
}package top.huey.designpattern.command;
import org.junit.Test;
/**
* @author huey
* @Description : invoker 身份
* @Date Created in 2018/8/21 14:36
*/
public class CommandInvokerTest {@Test
public void testInvoker() {
Light light = new Light();
//组合对象
OffCommand offCommand = new OffCommand(light);
OnCommand onCommand = new OnCommand(light);
//组合对象
RemoteCtrl remoteCtrl = new RemoteCtrl();
remoteCtrl.setCommands(1, offCommand, onCommand);
remoteCtrl.offButtonCommand(0);
remoteCtrl.onButtonCommand(0);
remoteCtrl.offButtonCommand(1);
remoteCtrl.onButtonCommand(1);
//撤销上一次
remoteCtrl.undoButtonCommand();
}
}
读者须知: 1.本
系列文章
内容会比较简陋,望有兴趣读者还是fork源码
,调试一下。(如果你看过该书,一定可以加深印象)2.联想下实际运用的哪些业务场景用到该模式,哪些中间件用到该模式,是否自己能在业务中使用。
3.即使你现在用不到某些设计模式,但是还是应该理解其原理的。
4.当时理解并不意味着自己已会,可以自己尝试练习,并幻想一种业务场景,画画类图,设计一下。
代码请参考码云:https://gitee.com/tjhuey/CodingGroupcoding
时,做到了如何落实
;
writing
时,做到了如何表达
;
sharing
时,做到了如何传授
;
thinking
时,做到了如何提升
;
设计模式相关概念请参考:http://naotu.baidu.com/file/5811bf42020e6a2d877b992cfca90d26
进度
- [x]
策略模式
,已完成 - [x]
观察者模式
,已完成; - [x]
装饰者模式
,已完成; - [x]
工厂方法模式
,已完成; - [x]
抽象工厂模式
,已完成; - [x]
单例模式
,已完成; - [x]
命令模式
,已完成; - [ ]
..
,未完成;
推荐阅读
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 《跨界歌手》:亲情永远比爱情更有泪点
- 诗歌:|诗歌: 《让我们举起世界杯,干了!》
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 人间词话的智慧
- 《一代诗人》37期,生活,江南j,拨动心潭的一泓秋水
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术
- 书评——《小行星》