【注意】最后更新于 January 19, 2018,文中内容可能已过时,请谨慎使用。
本文我们来讨论下java设计模式之命令模式.
命令模式,就是你给个命令我去执行.名称不太难理解,但是为什么会有这个命令模式呢?
假如说,我是个运维人员吧,我想配置下电脑网络.不同的系统是不一样的.如果我要都记住,每次需要用了就针对不同的系统做修改,不是不行,就是很累啊!
这个我用ifconfig
去查看linux系统,下次我用ipconfig
去查看windows网络.然后再加上修改网络配置就更麻烦了.如果有个人替我解析这些命令就好啦!
我给他说下,我要操作哪个系统,要进行什么操作,他替我完成,岂不是美滋滋?
我所有的操作系统都是可以抽象成一个接口,无外乎修改网络,查看网络,以及重启网络网络.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package top.txiner.command;
/**
* @author : hundred
* time: 18-1-19
* website : http://txiner.top
* 懵懂的小白
*/
public interface OperateSystem {
public void netStatus();
public void configNet();
public void restartNet();
}
|
比如我现在有个linux系统
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Linux implements OperateSystem{
public void netStatus(){
System.out.println("use ifconfig to get network status");
}
public void configNet(){
System.out.println("modify /etc/network/interfaces to config net");
}
public void restartNet(){
System.out.println("use service networking restart to restart network");
}
}
|
然后为了有人替我干活,我得把不同的命令封装出来,直接调用execute()
就好啦.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
public interface Command {
public void execute();
}
public class ConfigCommand implements Command {
private OperateSystem system;
public ConfigCommand(OperateSystem system) {
this.system = system;
}
@Override
public void execute() {
this.system.configNet();
}
}
public class StatusCommand implements Command {
private OperateSystem system;
public StatusCommand(OperateSystem system) {
this.system = system;
}
@Override
public void execute() {
this.system.netStatus();
}
}
public class RestartCommand implements Command {
private OperateSystem system;
public RestartCommand(OperateSystem system) {
this.system = system;
}
@Override
public void execute() {
this.system.restartNet();
}
}
|
接下来就是替我干活的那个人了!
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void action(){
this.command.execute();
}
}
|
很简单吧,他就是替我执行这些复杂的东西就完事了.
咱们试着来执行下
1
2
3
4
5
6
7
8
|
public class Mgr {
public static void main(String[] args) {
OperateSystem system=new Linux();
Command command=new StatusCommand(system);
Invoker invoker=new Invoker(command);
invoker.action();
}
}
|
好了,问题解决了!