设计模式 7 —— 命令模式

设计模式目录:

设计模式 1 ——观察者模式

设计模式 2 —— 装饰者模式

设计模式 3 —— 迭代器和组合模式(迭代器)

设计模式 4 —— 迭代器和组合模式(组合)

设计模式 5 —— 工厂模式

设计模式 6 —— 单件模式

设计模式 7 —— 命令模式

概述

第1部分 问题引入

第2部分 定义和实现

第3部分 使用宏命令

第1部分 问题引入

首先看下,下面的要求:

实现命令接口

首先,让说有的命令对象实现相同的包含一个方法的接口。

1 /**
2  * 命令接口
3  * @ClassName: Command
4  * @author Xingle
5  * @date 2014-9-11 上午10:13:46
6  */
7 public interface Command {
8     public void execute();
9 }

实现一个打开电灯的命令

在实现打开电灯或者关闭电灯之前,先看下灯的类

 1 public class Light {
 2
 3     public Light(){}
 4
 5     //开灯
 6     public void on(){
 7         System.out.println("Light is on");
 8     }
 9
10     //关灯
11     public void off(){
12         System.out.println("Light is off");
13     }
14 }

接着开灯以及关灯命令:

 1 /**
 2  * 实现一个开灯命令
 3  * @ClassName: LightOnCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 上午10:25:19
 7  */
 8 public class LightOnCommand implements Command{
 9
10     Light light;
11
12     public LightOnCommand(Light light){
13         this.light = light;
14     }
15
16     @Override
17     public void execute() {
18         light.on();
19     }
20
21 }
 1 /**
 2  * 实现一个关灯命令
 3  * @ClassName: LightOffCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 上午10:55:35
 7  */
 8 public class LightOffCommand implements Command{
 9
10     Light light;
11
12     public LightOffCommand(Light light){
13         this.light = light;
14     };
15
16     @Override
17     public void execute() {
18         light.off();
19     }
20
21 }

使用命令对象

假设我们有一个遥控器,它只有一个按钮和对应的插槽,可以控制一个装置:

 1 //
 2 //This is the invoker
 3 //
 4 public class SimpleRemoteControl {
 5     //一个插槽持有命令,控制着一个装置
 6     Command slot;
 7
 8     public SimpleRemoteControl(){};
 9
10     //这个方法用来设置插槽控制的命令。如果客户想要改变遥控器按钮的行为,可以多次调用这个方法
11     public void setCommand(Command command){
12         slot = command;
13     }
14     //当按下按钮时,这个方法就会被调用,使得当前命令衔接插槽,并调用它的execute()方法
15     public void buttonWasPressed(){
16         slot.execute();
17     }
18 }

下面再多加一个控制车库门的命令,车库门以及命令如下:

 1 /**
 2  * 车库门
 3  * @ClassName: GarageDoor
 4  * @author Xingle
 5  * @date 2014-9-11 上午10:53:15
 6  */
 7 public class GarageDoor {
 8     public GarageDoor() {
 9     }
10
11     public void up() {
12         System.out.println("Garage Door is Open");
13     }
14
15     public void down() {
16         System.out.println("Garage Door is Closed");
17     }
18
19     public void stop() {
20         System.out.println("Garage Door is Stopped");
21     }
22
23     public void lightOn() {
24         System.out.println("Garage light is on");
25     }
26
27     public void lightOff() {
28         System.out.println("Garage light is off");
29     }
30 }
 1 /**
 2  * 开车库门命令
 3  * @ClassName: GarageDoorOpenCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 上午10:53:52
 7  */
 8 public class GarageDoorOpenCommand implements Command{
 9
10     GarageDoor garageDoor;
11
12     public GarageDoorOpenCommand(GarageDoor garageDoor) {
13         this.garageDoor = garageDoor;
14     }
15
16     @Override
17     public void execute() {
18         garageDoor.up();
19     }
20 }

遥控器使用的简单测试:

 1 /**
 2  * 遥控器的测试程序
 3  * @ClassName: RemoteControlTest
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 上午10:57:38
 7  */
 8 public class RemoteControlTest {
 9     public static void main(String[] args){
10         //遥控器就是调用者,会传入一个命令对象,可以用来发出请求
11         SimpleRemoteControl remote = new SimpleRemoteControl();
12
13         //创建了一个电灯对象,也就是请求的接受者
14         Light light = new Light();
15         GarageDoor garageDoor = new GarageDoor();
16         //创建一个命令,然后将接受者传给它
17         LightOnCommand lightOn = new LightOnCommand(light);
18         GarageDoorOpenCommand garageOpen = new GarageDoorOpenCommand(garageDoor);
19
20         //把命令传给调用者
21         remote.setCommand(lightOn);
22         //模拟按下按钮
23         remote.buttonWasPressed();
24
25         remote.setCommand(garageOpen);
26         remote.buttonWasPressed();
27     }
28 }

执行结果:

第2部分 定义和实现

命令模式 将“请求”封装成对象,以便使用不用的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

  一个命令对象通过在特定接受者上绑定一组动作来封装一个请求。要达到这一点,命令对象将动作和接受者包进对象中。这个对象只暴露一个execute() 方法,当此方法被调用的时候,接收者就会进行这些动作。从外面看,其他对象不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute() 方法,请求的目的就能达到。

将命令指定到插槽

  将遥控器的每个插槽,对应到一个命令,这样就让遥控器变成“调用者”。当按下按钮,相应的命令对象的execute() 方法就会被调用,其结果是,接收者(例如:电灯、音响,电扇)的动作被调用。

实现遥控器

 1 /**
 2  * 带有撤销的遥控器
 3  * @ClassName: RemoteControlWithUndo
 4  * @author Xingle
 5  * @date 2014-9-11 下午12:18:47
 6  */
 7 public class RemoteControlWithUndo {
 8
 9     Command[] onCommands;
10     Command[] offCommands;
11     //前一个命令将被记录在这里
12     Command undoCommand;
13
14     public RemoteControlWithUndo() {
15         //遥控器要处理7个开与关的命令,使用相应数组记录这些命令
16         onCommands = new Command[7];
17         offCommands = new Command[7];
18         //空对象
19         Command noCommand = new NoCommand();
20
21         for (int i = 0; i < 7; i++) {
22             onCommands[i] = noCommand;
23             offCommands[i] = noCommand;
24         }
25         undoCommand = noCommand;
26     }
27
28     public void setCommand(int slot, Command onCommand, Command offCommand) {
29         onCommands[slot] = onCommand;
30         offCommands[slot] = offCommand;
31     }
32
33     public void onButtonWasPushed(int slot) {
34         onCommands[slot].execute();
35         undoCommand = onCommands[slot];
36     }
37
38     public void offButtonWasPushed(int slot) {
39         offCommands[slot].execute();
40         undoCommand = offCommands[slot];
41     }
42
43     public void undoButtonWasPushed() {
44         undoCommand.undo();
45     }
46
47     public String toString() {
48         StringBuffer stringBuff = new StringBuffer();
49         stringBuff.append("\n------ Remote Control -------\n");
50         for (int i = 0; i < onCommands.length; i++) {
51             stringBuff.append("[slot " + i + "] "
52                     + onCommands[i].getClass().getName() + "    "
53                     + offCommands[i].getClass().getName() + "\n");
54         }
55         stringBuff.append("[undo] " + undoCommand.getClass().getName() + "\n");
56         return stringBuff.toString();
57     }
58
59 }

命令接口

1 public interface Command {
2
3     public void execute();
4
5     //撤销操作
6     public void undo();
7
8 }

灯 的类

 1 /**
 2  * 灯
 3  * @ClassName: Light
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 上午11:52:57
 7  */
 8 public class Light {
 9     String location = "";
10
11     public Light(String location) {
12         this.location = location;
13     }
14
15     public void on() {
16         System.out.println(location + " light is on");
17     }
18
19     public void off() {
20         System.out.println(location + " light is off");
21     }
22 }

实现命令

 1 /**
 2  * 开灯
 3  * @ClassName: LightOnCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 上午11:52:18
 7  */
 8 public class LightOnCommand implements Command{
 9     Light light ;
10
11     public LightOnCommand(Light light){
12         this.light = light;
13     }
14     @Override
15     public void execute() {
16         light.on();
17     }
18     @Override
19     public void undo() {
20         light.off();
21     }
22
23 }
 1 /**
 2  * 关灯
 3  * @ClassName: LightOffCommand
 4  * @author Xingle
 5  * @date 2014-9-11 下午12:00:05
 6  */
 7 public class LightOffCommand implements Command {
 8
 9     Light light;
10
11     public LightOffCommand(Light light) {
12         this.light = light;
13     }
14
15     @Override
16     public void execute() {
17         light.off();
18     }
19
20     @Override
21     public void undo() {
22         light.on();
23     }
24
25 }

音响

 1 /**
 2  * 音响
 3  * @ClassName: Stereo
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 上午11:54:46
 7  */
 8 public class Stereo {
 9
10     String location;
11
12     public Stereo(String location) {
13         this.location = location;
14     }
15
16     public void on() {
17         System.out.println(location + " stereo is on");
18     }
19
20     public void off() {
21         System.out.println(location + " stereo is off");
22     }
23
24     public void setCD() {
25         System.out.println(location + " stereo is set for CD input");
26     }
27
28     public void setDVD() {
29         System.out.println(location + " stereo is set for DVD input");
30     }
31
32     public void setRadio() {
33         System.out.println(location + " stereo is set for Radio");
34     }
35
36     public void setVolume(int volume) {
37         System.out.println(location + " Stereo volume set to " + volume);
38     }
39
40 }

音响的命令操作

 1 /**
 2  * 开音响
 3  * @ClassName: StereoOnWithCDCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 上午11:54:19
 7  */
 8 public class StereoOnWithCDCommand implements Command{
 9
10     Stereo stereo;
11
12     public StereoOnWithCDCommand(Stereo stereo) {
13         this.stereo = stereo;
14     }
15
16     @Override
17     public void execute() {
18         stereo.on();
19     }
20
21     @Override
22     public void undo() {
23         stereo.off();
24     }
25
26 }
 1 /**
 2  * 关音响
 3  * @ClassName: StereoOffCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 下午12:03:02
 7  */
 8 public class StereoOffCommand implements Command{
 9     Stereo stereo;
10
11     public StereoOffCommand(Stereo stereo) {
12         this.stereo = stereo;
13     }
14
15     @Override
16     public void execute() {
17         stereo.off();
18     }
19
20     @Override
21     public void undo() {
22         stereo.on();
23     }
24
25 }

吊扇

 1 /**
 2  * 吊扇
 3  *
 4  * @ClassName: CeilingFan
 5  * @author Xingle
 6  * @date 2014-9-11 下午12:36:04
 7  */
 8 public class CeilingFan {
 9
10
11     public static final int HIGH = 3;
12     public static final int MEDIUM = 2;
13     public static final int LOW = 1;
14     public static final int OFF = 0;
15     String location;
16     int speed;
17
18     public CeilingFan(String location) {
19         this.location = location;
20         speed = OFF;
21     }
22
23     //高速
24     public void high() {
25         speed = HIGH;
26         System.out.println(location + " ceiling fan is on high");
27     }
28     //中速
29     public void medium() {
30         speed = MEDIUM;
31         System.out.println(location + " ceiling fan is on medium");
32     }
33     //低速
34     public void low() {
35         speed = LOW;
36         System.out.println(location + " ceiling fan is on low");
37     }
38     //关闭
39     public void off() {
40         speed = OFF;
41         System.out.println(location + " ceiling fan is off");
42     }
43
44     public int getSpeed() {
45         return speed;
46     }
47
48 }

电扇的三个命令,分别把电扇开到高速,中速,和低速

 1 /**
 2  * 开电扇到高速
 3  * @ClassName: CeilingFanHighCommand
 4  * @author Xingle
 5  * @date 2014-9-11 下午12:37:20
 6  */
 7 public class CeilingFanHighCommand implements Command {
 8
 9     CeilingFan ceilingFan;
10     int prevSpeed;
11
12     public CeilingFanHighCommand(CeilingFan ceilingFan) {
13         this.ceilingFan = ceilingFan;
14     }
15
16     @Override
17     public void execute() {
18         prevSpeed = ceilingFan.getSpeed();
19         ceilingFan.high();
20     }
21
22     @Override
23     public void undo() {
24         if (prevSpeed == CeilingFan.HIGH) {
25             ceilingFan.high();
26         } else if (prevSpeed == CeilingFan.MEDIUM) {
27             ceilingFan.medium();
28         } else if (prevSpeed == CeilingFan.LOW) {
29             ceilingFan.low();
30         } else if (prevSpeed == CeilingFan.OFF) {
31             ceilingFan.off();
32         }
33     }
34
35 }
 1 /**
 2  * 开电扇到中速
 3  * @ClassName: CeilingFanMediumCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 下午12:39:57
 7  */
 8 public class CeilingFanMediumCommand implements Command{
 9     CeilingFan ceilingFan;
10     int prevSpeed;
11
12     public CeilingFanMediumCommand(CeilingFan ceilingFan) {
13         this.ceilingFan = ceilingFan;
14     }
15     @Override
16     public void execute() {
17         prevSpeed = ceilingFan.getSpeed();
18         ceilingFan.medium();
19     }
20
21     @Override
22     public void undo() {
23         if (prevSpeed == CeilingFan.HIGH) {
24             ceilingFan.high();
25         } else if (prevSpeed == CeilingFan.MEDIUM) {
26             ceilingFan.medium();
27         } else if (prevSpeed == CeilingFan.LOW) {
28             ceilingFan.low();
29         } else if (prevSpeed == CeilingFan.OFF) {
30             ceilingFan.off();
31         }
32     }
33 }
 1 /**
 2  * 开电扇到低速
 3  * @ClassName: CeilingFanLowCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 下午12:38:25
 7  */
 8 public class CeilingFanLowCommand implements Command{
 9
10     CeilingFan ceilingFan;
11     int prevSpeed;
12
13     public CeilingFanLowCommand(CeilingFan ceilingFan) {
14         this.ceilingFan = ceilingFan;
15     }
16
17     @Override
18     public void execute() {
19         prevSpeed = ceilingFan.getSpeed();
20         ceilingFan.low();
21     }
22
23     @Override
24     public void undo() {
25         if (prevSpeed == CeilingFan.HIGH) {
26             ceilingFan.high();
27         } else if (prevSpeed == CeilingFan.MEDIUM) {
28             ceilingFan.medium();
29         } else if (prevSpeed == CeilingFan.LOW) {
30             ceilingFan.low();
31         } else if (prevSpeed == CeilingFan.OFF) {
32             ceilingFan.off();
33         }
34     }
35
36 }

关电扇命令

 1 /**
 2  * 关电扇
 3  * @ClassName: CeilingFanOffCommand
 4  * TODO
 5  * @author Xingle
 6  * @date 2014-9-11 下午12:45:18
 7  */
 8 public class CeilingFanOffCommand implements Command{
 9
10     CeilingFan ceilingFan;
11     int prevSpeed;
12
13     public CeilingFanOffCommand(CeilingFan ceilingFan) {
14         this.ceilingFan = ceilingFan;
15     }
16
17     @Override
18     public void execute() {
19         prevSpeed = ceilingFan.getSpeed();
20         ceilingFan.off();
21     }
22
23     @Override
24     public void undo() {
25         if (prevSpeed == CeilingFan.HIGH) {
26             ceilingFan.high();
27         } else if (prevSpeed == CeilingFan.MEDIUM) {
28             ceilingFan.medium();
29         } else if (prevSpeed == CeilingFan.LOW) {
30             ceilingFan.low();
31         } else if (prevSpeed == CeilingFan.OFF) {
32             ceilingFan.off();
33         }
34     }
35
36 }

测试遥控器

 1 /**
 2  * 测试程序
 3  *
 4  * @ClassName: RemoteLoader
 5  * @author Xingle
 6  * @date 2014-9-11 上午11:57:26
 7  */
 8 public class RemoteLoader {
 9     public static void main(String[] args) {
10
11         RemoteControlWithUndo remoteControl = new RemoteControlWithUndo();
12
13         Light livingRoomLight = new Light("Living Room");
14
15         CeilingFan ceilingFan = new CeilingFan("ww Room");
16
17
18
19         LightOnCommand livingRoomLightOn = new LightOnCommand(livingRoomLight);
20         LightOffCommand livingRoomLightOff = new LightOffCommand(livingRoomLight);
21
22         CeilingFanMediumCommand ceilingFanMedium = new CeilingFanMediumCommand(ceilingFan);
23         CeilingFanLowCommand ceilingFanLow = new CeilingFanLowCommand(ceilingFan);
24         CeilingFanHighCommand ceilingFanHigh = new CeilingFanHighCommand(ceilingFan);
25         CeilingFanOffCommand ceilingFanOff = new CeilingFanOffCommand(ceilingFan);
26
27         //
28         remoteControl.setCommand(0, livingRoomLightOn, livingRoomLightOff);
29         remoteControl.setCommand(1, ceilingFanMedium, ceilingFanOff);
30         remoteControl.setCommand(2, ceilingFanHigh, ceilingFanOff);
31
32         remoteControl.onButtonWasPushed(0);
33         remoteControl.offButtonWasPushed(0);
34         System.out.println(remoteControl);
35         remoteControl.undoButtonWasPushed();
36
37         remoteControl.onButtonWasPushed(1);//中速开
38         remoteControl.offButtonWasPushed(1);//关闭
39         System.out.println(remoteControl);
40         remoteControl.undoButtonWasPushed();//撤销,会回到中速
41
42         remoteControl.onButtonWasPushed(2);//高度开
43         System.out.println(remoteControl);//
44         remoteControl.undoButtonWasPushed();//撤销,回到中速
45     }
46
47 }

执行结果:

Living Room light is on
Living Room light is off

------ Remote Control -------
[slot 0] firsthead.command.remote.LightOnCommand firsthead.command.remote.LightOffCommand
[slot 1] firsthead.command.remote.CeilingFanMediumCommand firsthead.command.remote.CeilingFanOffCommand
[slot 2] firsthead.command.remote.CeilingFanHighCommand firsthead.command.remote.CeilingFanOffCommand
[slot 3] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 4] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 5] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 6] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[undo] firsthead.command.remote.LightOffCommand

Living Room light is on
ww Room ceiling fan is on medium
ww Room ceiling fan is off

------ Remote Control -------
[slot 0] firsthead.command.remote.LightOnCommand firsthead.command.remote.LightOffCommand
[slot 1] firsthead.command.remote.CeilingFanMediumCommand firsthead.command.remote.CeilingFanOffCommand
[slot 2] firsthead.command.remote.CeilingFanHighCommand firsthead.command.remote.CeilingFanOffCommand
[slot 3] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 4] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 5] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 6] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[undo] firsthead.command.remote.CeilingFanOffCommand

ww Room ceiling fan is on medium
ww Room ceiling fan is on high

------ Remote Control -------
[slot 0] firsthead.command.remote.LightOnCommand firsthead.command.remote.LightOffCommand
[slot 1] firsthead.command.remote.CeilingFanMediumCommand firsthead.command.remote.CeilingFanOffCommand
[slot 2] firsthead.command.remote.CeilingFanHighCommand firsthead.command.remote.CeilingFanOffCommand
[slot 3] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 4] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 5] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[slot 6] firsthead.command.remote.NoCommand firsthead.command.remote.NoCommand
[undo] firsthead.command.remote.CeilingFanHighCommand

ww Room ceiling fan is on medium

第3部分 使用宏命令

时间: 2024-11-10 01:01:55

设计模式 7 —— 命令模式的相关文章

设计模式之命令模式

命令模式的核心是把方法调用封装起来,调用的对象不需要关心是如何执行的. 定义:命令模式将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也可以支持撤销操作. 先看一个例子,设计一个家电遥控器的API,可以通过遥控器发出命令来控制不同生产商生产的家电,比如关灯.开灯. 以下是一个简单的代码示例. 1 package cn.sp.test05; 2 /** 3 * 电灯类 4 * @author 2YSP 5 * 6 */ 7 public class Lig

设计模式之命令模式20170719

行为型设计模式之命令模式: 一.含义 将请求(命令)封装成一个对象(内部有接收者对象,以及按照具体命令执行接收者操作的方法),传递给调用者,由调用者执行具体命令. 也就是把一个动作的执行分为执行对象(接收者角色).执行行为(命令角色),让两者相互独立而不相互影响,实现对动作解耦 二.代码说明 1.主要有三个角色 1)接收者角色 该角色就是干活的角色,被命令角色调用,其操作按具体命令的要求执行 2)命令角色 需要执行的所有命令都在这里声明,同时接收者所有的对象都在这里(接收者封装在这里,防止高层模

跟我学设计模式视频教程——命令模式vs策略模式,唠嗑

课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--命令模式vs策略模式,唠嗑,布布扣,bubuko.com

用Java 8 Lambda表达式实现设计模式:命令模式

链接:http://www.importnew.com/16789.html 在这篇博客里,我将说明如何在使用Java 8 Lambda表达式的函数式编程方式时实现命令设计模式.命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化,并提供相应的操作.命令模式是一种通用编程方式,该方式基于运行时决策顺序来执行方法.模式的参与者如下: 命令 :声明用于执行操作的接口. 实体命令 :定义接收者对象和动作的绑定. 客户端 :创建实体命令实例并设置它的接收者. 调用者:

设计模式 ( 十三 ) 命令模式Command(对象行为型)

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题

设计模式(6)--命令模式

关键词 :空对象 有人称为设计模式 三层调用 1. 封装调用  , 把封装带到一个全新的境界: 把方法调用(method invocation) 封装起来. 2. 命令模式可将"动作的请求者" 从"动作的执行者" 对象中解耦. 3. 当需要将发出的请求和执行请求的对象解耦的时候,使用命令模式. OO原则: (1)封装变化 (2) 多用组合,少用继承 (3)针对接口编程,不针对实现编程 (4)为交互对象之间松耦合设计而努力 (5) 类应该对扩展开放,对修改关闭 (6)

C#设计模式(15)——命令模式(Command Pattern)

原文:C#设计模式(15)--命令模式(Command Pattern) 一.前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区别在于它们实现功能的可扩展和可维护性,也就是代码的是否“优美”.可读.但是,要更好地应用,首先就必须了解各种设计模式和其应用场景,所以我还是希望继续完

每天一个设计模式之命令模式

作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 原文地址是:<每天一个设计模式之命令模式> 欢迎关注个人技术博客:godbmw.com.每周 1 篇原创技术分享!开源教程(webpack.设计模式).面试刷题(偏前端).知识整理(每周零碎),欢迎长期关注! 如果您也想进行知识整理 + 搭建功能完善/设计简约/快速启动的个人博客,请直接戳the

理解设计模式之----命令模式

零零碎碎的了解过部分设计模式,但没有系统的学习过,最近晚上有点时间,就买了本程杰的<大话设计模式>,最近想系统的学习下.当看到命令模式的时候,感觉并不是太好理解,于是上网搜索了些资料.发现对设计模式的看法多少很多文章都有些不一样,于是想写下自己对命令模式的一些看法,以加深理解.要是文章有不对的地方,希望大家能提出改进建议. 目的: 任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果.命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合