重要的Java模式——命令模式

本文详细阐述了命令模式的原理、组件及其实现过程,包括Command、CommandManager和Invoker三个关键部分。通过具体示例展示了如何利用命令模式简化软件行为的管理与执行流程,特别强调了其在传递资源、执行命令与处理错误方面的强大功能。

命令模式提供一个处理用户请求的标准接口。每个请求被封装名为Command的对象中。命令模式中的三个类分别是:Command、CommandManager和Invoker。

Command

Command类表示单个行为的封装。应用程序中的每个行为,例如保存或者删除,都会被建模为命令。这样,应用程序的行为就是命令对象的集合。要向应用程序添加行为,开发人员要做的就只是实现附加的命令对象。

如下:

package command; public interface Command { public void execute(); }


Command接口,只是含有一个execute方法,其它的实现Command接口的类(DefaultCommand)就是一个命令,如下:

package command; public class DefaultCommand implements Command{ public void execute(){ System.out.println("DefaultCommand命令执行中..."); } }

当然,也可以扩展Command接口,实现更多的功能:

package command; import java.util.Collection; import java.util.Map; /** * 扩展自Command接口,ManagedCommand实现了该接口 * */ public interface ManagedLifecycle extends Command{ public void setApplicationContext(Map context);//用于传输需要的应用程序数据 public void initialize();//初始化方法 public boolean isValidated();//执行验证 public Collection<?> getErrors();//获取错误信息 public void destory();//销毁 }

下面是实现ManagedCommand类,实现了ManagedLifecycle,也是一个命令:

package command; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * 比DefaultCommand功能丰富很多,首先传递需要的应用程序数据,调用初始化方法,执行验证,最后执行命令 * * */ public class ManagedCommand implements ManagedLifecycle{ private Map<?,?> context; private Map<?,?> errors = new HashMap(); //初始化 public void initialize() { System.out.println("初始化..."); } //执行 public void execute() { System.out.println("ManagedCommand命令执行中..."); } //销毁 public void destory() { System.out.println("销毁中..."); } //是否验证成功 public boolean isValidated() { System.out.println("验证成功..."); return true; } public void setApplicationContext(Map context) { System.out.println("传输应用程序数据..."); this.context = context; } //获取错误信息 public Collection<?> getErrors() { return errors.values(); } }

CommandManager

命令模式的下一个组件CommandManager该类负责管理对应用程序可用的命令。下面的CommandManager,处理所有的请求,使用一个HashMap,所有的命令将在请求处理之前被初始化,然后通过名称被获取

package command; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * 处理所有的请求,使用一个HashMap,所有的命令将在请求处理之前被初始化,然后通过名称被获取 * */ public class CommandManager { private Map<String, Command> commands = new HashMap<String, Command>(); public void add(String name, Command command){ commands.put(name,command); } public Command getCommand(String name){ return commands.get(name); } }

Invoker

负责按照一定方式执行命令类。看下面的Client类:

package command; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * 一个单独的客户端可以掩饰命令模式的执行。单调用Client构造憾事是,它想管理器添加 */ public class Client { private Map context = new HashMap(); private CommandManager manager = new CommandManager(); public Client(){ manager.add("default", new DefaultCommand()); //一个新的命令添加到CommandManager中去 manager.add("Managed", new ManagedCommand()); } public void invoke(String name){ Command command = manager.getCommand(name); //确定被执行的命令是否实现了ManagedLifecycle接口 if(command instanceof ManagedLifecycle){ ManagedLifecycle managed =(ManagedLifecycle) command; managed.setApplicationContext(context); managed.initialize(); if(managed.isValidated()){ managed.execute(); }else{ Collection<?> error = managed.getErrors(); } managed.destory(); }else{ command.execute(); } } public static void main(String[] args){ Client client = new Client(); System.out.println("1、执行DefaultCommand命令:"); client.invoke("default"); System.out.println("2、执行ManagedCommand命令:"); client.invoke("Managed"); } }

运行结果:


允许客户端Invoker将资源传递到命令中是一个非常强大的概念,被称为反向控制(inversion of control,IOC)或依赖关系注入。它无需Command类去查找可用于invoker的服务和资源。


命令模式例子使用命令模式,告别if-else


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值