命令模式:你的系统设计一个命令行界面,用户可输入命令来执行某项功能。通过命令来执行该命令执行具体要做的事情,这个可以应对系统不因功能的添加而修改,又可灵活加入命令和功能。
以命令的方式,解耦调用者与功能的具体实现者,降低系统耦合度,提供了灵活性。如:Servlet Controller 线程池。接下来我们举个应用场景:点奶茶,通过客户点单选择不同的奶茶执行,相应的流程。
示例代码
/**
* 统一抽象出来的命令操作
*/
public interface Command {
public void build();//生产奶茶
}
/**
* 命令之-烧仙草
*/
public class ShaoxiancaoMilk implements Command {
public void build() {
System.out.println("制作烧仙草");
}
}
/**
* 命令之-木瓜
*/
public class PawpawMilk implements Command {
@Override
public void build() {
System.out.println("制作木瓜奶茶");
}
}
/**
* 命令之-原味
*/
public class TasteMilk implements Command {
@Override
public void build() {
System.out.println("开始制作原味奶茶");
}
}
/**
* 服务生招待客人
*/
public class Waitress {
private Map<String, Command> commands = new HashMap<>();
public void register(String cmd, Command run) {
commands.put(cmd, run);
}
/**
* 客人点单
*/
public void receiver(String command) {
System.out.println("您选择了:"+command);
Command cmd = commands.get(command);
if(cmd == null) {
System.out.println("没有这样的品种");
}else {
cmd.build();
}
}
public void showMenu() {
System.out.println("老板你好,本有以下奶茶:");
commands.keySet().forEach((item)->{
System.out.println("\t"+item);
});
}
}
测试代码:
public static void main(String[] args) {
Waitress waiter = new Waitress();
waiter.register("烧仙草", new ShaoxiancaoMilk());
waiter.register("原味奶茶", new TasteMilk());
waiter.register("木瓜奶茶", new PawpawMilk());
waiter.showMenu();
Scanner scanner = new Scanner(System.in);
System.out.println("请选择:");
// 发送内容
String command = scanner.nextLine();
waiter.receiver(command);
scanner.close();
}
--控制台
老板你好,本有以下奶茶:
木瓜奶茶
烧仙草
原味奶茶
请选择:
木瓜奶茶 (控制台输入的)
您选择了:木瓜奶茶
制作木瓜奶茶