文章目录
- 一、介绍
- 二、命令模式中的角色
- 三、案例
- 1. 命令的抽象接口`Command`
- 2. 进攻`AttackCommand`
- 3. 意大利炮`cannonCommand`
- 4. 开炮`FireCommand`
- 5. 李云龙`LiYunLong`
- 6. 运行案例
- 四、优缺点
一、介绍
命令模式(Command Pattern),属于行为型设计模式。指的是把方法调用封装成命令,然后执行该命令。目的是为了将类中的各个方法抽出来,形成独立的类,且该类只有一个方法execute()
,调用该类的execute()
方法就等同于调用原类中对应的方法。
更接地气的说法是,A类中有B、C、D三个方法,使用命令模式,将这三个方法抽出来形成独立的类:BCommond
、CCommond
、DCommond
,这三个类都实现Command
接口中的execute()
方法,方法的具体实现与A类中的B、C、D三个方法相同。
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
二、命令模式中的角色
在命令模式中,我们需要将一个类中的方法都提取出来,将它们封装成对应的命令类(XXXCommand
),通过调用这些命令类的执行方法execute()
来运行对应的逻辑,因此我们可以声明一个命令的抽象接口Command
类,由不同的具体命令实现该抽象接口。因此,命令模式中包含两个角色:抽象命令接口Command
、命令接口实现类XXXCommand
。
-
抽象命令接口
Command
定义一个命令的基本功能方法
execute()
,用于执行命令。代码如下所示public interface Command { void execute(); }
-
命令接口实现类
XXXCommand
实现抽象命令接口
Command
,对接口中的execute()
方法进行具体实现。代码如下所示public class XXXCommand implements Command{ @Override public void execute() { System.out.println("执行XXX命令对应的逻辑..."); } }
-
调用命令的客户端类
CommandClient
在客户端中,通过对命令对象的声明,进而调用该对象的
execute()
方法以执行对应的命令。public class CommandClient { public static void main(String[] args) { XXXCommand command = new XXXCommand(); command.execute(); } }
下面是命令模式的通用UML类图
三、案例
没办法,一说到命令俺就只能想到打仗,那就不妨以李云龙攻打平安县城为例吧。哈哈哈。
李云龙作为三八六旅独立团团长,可以向他指挥的士兵下达任何作战命令,比如:进攻(attack
)、拉意大利炮(cannon
)、开炮(fire
),对于这三个命令来说,李云龙相当于命令模式中的客户端,通过下达这几个命令,他的士兵就会执行相应的命令。
因此结合案例,我们通过代码对其进行演示。
1. 命令的抽象接口Command
每一个命令都需要被执行,因此将其抽象为接口类Command
,并声明其执行方法execute()
。
public interface Command {
void execute();
}
2. 进攻AttackCommand
新建进攻命令AttackCommand
,并实现命令接口Command
定义的execute()
方法。
当李云龙对着战士们说:兄弟们冲啊。此时就下达了进攻命令。
public class AttackCommand implements Command{
@Override
public void execute() {
System.out.println("士兵进行冲锋进攻。。。");
}
}
3. 意大利炮cannonCommand
与**进攻命令(AttackCommand
)**相似,实现命令接口,实现方法逻辑。
当李云龙对着二营长说:**二营长,你他娘的意大利炮呢?**此时就下达了拿出意大利炮的命令。
public class CannonCommand implements Command{
@Override
public void execute() {
System.out.println("二营长将意大利炮拉出来了。。。");
}
}
4. 开炮FireCommand
与**进攻命令(AttackCommand
)**相似,实现命令接口,实现方法逻辑
当李云龙对着战士说:开炮~~~,这就是开炮命令,战士则需要向平安县城城楼开炮了。
public class FireCommand implements Command{
@Override
public void execute() {
System.out.println("士兵向平安县城城楼开炮。。。");
}
}
5. 李云龙LiYunLong
李云龙作为独立团指挥官,负责下达各种作战命令。
public class LiYunLong {
public static void main(String[] args) {
System.out.println("李云龙:兄弟们冲啊");
AttackCommand attackCommand = new AttackCommand();
attackCommand.execute();
System.out.println();
System.out.println("李云龙:二营长,你他娘的意大利炮呢?");
CannonCommand cannonCommand = new CannonCommand();
cannonCommand.execute();
System.out.println();
System.out.println("李云龙:开炮~~~");
FireCommand fireCommand = new FireCommand();
fireCommand.execute();
}
}
6. 运行案例
运行以上案例,模拟李云龙下达作战命令后,得到以下输出
四、优缺点
使用命令模式后,我们可以总结出以下优缺点
优点:
- 降低了系统耦合度
- 新的命令可以很容易添加到系统中去。
缺点:
- 导致系统有过多的具体命令类。每一个命令都需要新建一个类。
纸上得来终觉浅,绝知此事要躬行。
————————我是万万岁,我们下期再见————————