⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex6_48.txt

📁 j2ee core design patterns
💻 TXT
字号:
Example 6.48 	CommandAndViewFactory
// Command and View Dual-Factory creates Command and View
// instances based on current application state and requested operation
public class CommandAndViewFactory {
  private static CommandAndViewFactory ourInstance;

  public synchronized static CommandAndViewFactory getInstance() {
    if (ourInstance == null) {
      ourInstance = new CommandAndViewFactory();
    }
    return ourInstance;
  }

  private CommandAndViewFactory() {
    commandviewMap = CommandViewMap.getInstance();
  }

  public CommandViewHandle getCommand(String event, String state) {
    CommandViewHandle handle =
        commandviewMap.getCommandViewHandle(event, state);
    return handle;
  }

  public String getView(String event, String state) {
    return commandviewMap.
        getCommandViewHandle(event, state).getViewName();
  }

  CommandViewMap commandviewMap;
}

class CommandViewMap {

  private static CommandViewMap ourInstance;

    public synchronized static CommandViewMap getInstance() {
      if (ourInstance == null) {
        ourInstance = new CommandViewMap();
      }
      return ourInstance;
    }

  private CommandViewMap() {
    initialize();
  }

  // Initialize map for all valid state and event combinations
  private void initialize() {
    addEventStateEntry(
        OrderEvents.EnterOrder, OrderStatus.ORDER_NEW,
        PlaceOrderCommand.class,
        "/jsp/ApplicationController/OrderPlaced");

    addEventStateEntry(OrderEvents.ApproveOrder,
        OrderStatus.ORDER_PLACED, ApproveOrderCommand.class,
        "/jsp/ApplicationController/OrderApproved");

    addEventStateEntry(OrderEvents.DeclineOrder,
        OrderStatus.ORDER_PLACED,
        DeclineOrderCommand.class,
        "/jsp/ApplicationController/OrderDeclined");

    addEventStateEntry(OrderEvents.TerminateOrder,
        OrderStatus.ORDER_PLACED, TerminateOrderCommand.class,
        "/jsp/ApplicationController/OrderTerminated");

    addEventStateEntry(OrderEvents.ShipOrder,
        OrderStatus.ORDER_APPROVED, TerminateOrderCommand.class,
        "/jsp/ApplicationController/OrderShipped");

    addEventStateEntry(OrderEvents.TerminateOrder, 
        OrderStatus.ORDER_APPROVED,  TerminateOrderCommand.class,
        "/jsp/ApplicationController/OrderTerminated");

    addEventStateEntry(OrderEvents.TerminateOrder, 
        OrderStatus.ORDER_DECLINED, TerminateOrderCommand.class, 
        "/jsp/ApplicationController/OrderTerminated");
    . . .
  }

  void addEventStateEntry(String event, Object state, 
      Class domainCommand, String viewName) {
    CommandViewHandle newResponse = 
        new CommandViewHandle(domainCommand, viewName);
    if ( !events.containsKey(event))
      events.put(event, new HashMap());
    getEventMap(event).put(state, newResponse);
  }

  private Map getEventMap(String key ) {
    return (Map)events.get(key);
  }

  public CommandViewHandle getCommandViewHandle(
      String operation, String state) {
    return (CommandViewHandle)getEventMap(operation).get(state);
  }
  private Map events = new HashMap();
}

class CommandViewHandle {
  public CommandViewHandle(Class domainCommand, String viewName) {
    this.domainCommand = domainCommand;
    this.viewName = viewName;
  }

  public Class getCommandHandle() {
    return domainCommand;
  }

  public String getViewName() {
    return viewName;
  }

  private Class domainCommand;
  private String viewName;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -