1. 命令模式
1.1. 概述
l 将来自客户端的请求传入一个对象,无需了解这个请求激活的动作或有关接受这个请求的处理细节。
l 具体的Command模式代码各式各样,因为如何封装命令,不同系统有不同的做法,下面事例是将命令封装在一个Collection的List中,任何对象一旦加入List中,实际上装入了一个封闭的黑盒中,对象的特征消失了,只有取出时,才有可能模糊的分辨出
l 客户端要调用几个命令,这几个命令来自于不同的模块,这样,客户端必须知道这几个模块的内容,那我们能否将这些命令封装在一起传给客户端,隐藏这些命令的来源信息?
l 方法:将这几个模块用接口管理,对象传入Collection,在客户端通过接口编程。
1.2. 实例演示
import java.util.*; interface Command{ public abstract void executeCommand(); } class Module1 implements Command{ public void fun1(){ System.out.println("一些功能"); } /*public void fun2(),.....*/ //以下功能在客户端调用"命令1"时调用 public void executeCommand(){ System.out.println("显示模块1"); }
} class Module2 implements Command{ public void fun1(){ System.out.println("一些功能"); } /*public void fun2(),.....*/ //以下功能在客户端调用"命令2"时调用 public void executeCommand(){ System.out.println("显示模块2"); } }
class CommandConstructor{//不负责生成模块,只负责组织模块和命令(甚至可以用配置文件) //将每一个模块和命令名称映射起来 private static HashMap commandPool = new HashMap(); public static void constructCommandPool(){ //以下两句,只是测试使用,实际应用中并不一定在这里new,各个模块引用可能从外界传递过来 Module1 module1 = new Module1(); Module2 module2 = new Module2(); commandPool.put("命令1",module1); commandPool.put("命令2",module2); } public static Command getCommand(String key){ return (Command)commandPool.get(key); } }
public class Command1{ //客户端调用命令时,能否无需关心来源,只需关心调用 public static void main(String args[]){ CommandConstructor.constructCommandPool(); Command c1 = CommandConstructor.getCommand("命令2"); c1.executeCommand(); } } |