本文我们来讨论下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();
    }
}

好了,问题解决了!