37.3.3. placeWidgetOrder Operation


概述

placeWidgetOrder 使用两个包含替换组的复杂类型。此操作演示了在 Java 实施中使用这种结构。使用者和服务都必须获取和设置替换组的成员。

消费者实施

若要调用 placeWidgetOrder (),消费者必须构建包含小部件替换组的某一元素的小部件顺序。将小部件添加到订单时,使用者应使用为替换组的每个元素生成的对象工厂方法。这样可确保运行时和服务可以正确处理顺序。例如,如果将某一顺序放在 plastic 小部件,则使用 ObjectFactory.createPlasticWidget () 方法创建元素,然后再将其添加到订购前。

例 37.16 “设置 Substitution 组成员” 显示用于设置 WidgetOrderInfo 对象 的小部件 属性使用者代码。

例 37.16. 设置 Substitution 组成员

ObjectFactory of = new ObjectFactory();

WidgetOrderInfo order = new of.createWidgetOrderInfo();
...
System.out.println();
System.out.println("What color widgets do you want to order?");
String color = reader.readLine();
System.out.println();
System.out.println("What shape widgets do you want to order?");
String shape = reader.readLine();
System.out.println();
System.out.println("What type of widgets do you want to order?");
System.out.println("1 - Normal");
System.out.println("2 - Wood");
System.out.println("3 - Plastic");
System.out.println("Selection [1-3]");
String selection = reader.readLine();
String trimmed = selection.trim();
char widgetType = trimmed.charAt(0);
switch (widgetType)
{
  case '1':
  {
    WidgetType widget = of.createWidgetType();
    widget.setColor(color);
    widget.setShape(shape);
    JAXB<WidgetType> widgetElement = of.createWidget(widget); order.setWidget(widgetElement);
    break;
  }
  case '2':
  {
    WoodWidgetType woodWidget = of.createWoodWidgetType();
    woodWidget.setColor(color);
    woodWidget.setShape(shape);
    System.out.println();
    System.out.println("What type of wood are your widgets?");
    String wood = reader.readLine();
    woodWidget.setWoodType(wood);
    JAXB<WoodWidgetType> widgetElement = of.createWoodWidget(woodWidget); order.setWoodWidget(widgetElement);
    break;
  }
  case '3':
  {
    PlasticWidgetType plasticWidget = of.createPlasticWidgetType();
    plasticWidget.setColor(color);
    plasticWidget.setShape(shape);
    System.out.println();
    System.out.println("What type of mold to use for your
                        widgets?");
    String mold = reader.readLine();
    plasticWidget.setMoldProcess(mold);
    JAXB<WidgetType> widgetElement = of.createPlasticWidget(plasticWidget); order.setPlasticWidget(widgetElement);
    break;
  }
  default :
    System.out.println("Invaid Widget Selection!!");
    }

服务实施

placeWidgetOrder () 方法以 WidgetOrderInfo 对象的形式收到顺序,处理订购过程,并以 WidgetOrderBill 的形式将 bill 返回给消费者。订单可以是纯文本小部件,也可以是一个wooden 小部件。排序的小部件类型由 widget OrderForm 对象的小部件属性中存储什么类型来决定。widget 属性是一个替换组,可以包含 小部件 元素、woodWidget 元素或 plasticWidget 元素。

该实施必须确定哪些可能元素按照顺序存储。这可以使用 JAXBElement< 扩展了 T& gt; 对象的 getName () 方法来确定元素的 QName。然后,可以使用 QName 来决定替换组中的哪个元素按顺序排列。当 bill 中包含的元素被已知后,您可以将其值提取到正确的对象类型。

例 37.17 “Implementation of placeWidgetOrder() 显示可能的实施。

例 37.17. Implementation of placeWidgetOrder()

public com.widgetvendor.types.widgettypes.WidgetOrderBillInfo placeWidgetOrder(WidgetOrderInfo widgetOrderForm)
{
  ObjectFactory of = new ObjectFactory();

  WidgetOrderBillInfo bill = new WidgetOrderBillInfo()

   // Copy the shipping address and the number of widgets
   // ordered from widgetOrderForm to bill
   ...

  int numOrdered = widgetOrderForm.getAmount();

  String elementName = widgetOrderForm.getWidget().getName().getLocalPart();
  if (elementName.equals("woodWidget")
  {
    WoodWidgetType widget=order.getWidget().getValue();
    buildWoodWidget(widget, numOrdered);

    // Add the widget info to bill
    JAXBElement<WoodWidgetType> widgetElement = of.createWoodWidget(widget);
    bill.setWidget(widgetElement);

    float amtDue = numOrdered * 0.75;
    bill.setAmountDue(amtDue);
  }
  else if (elementName.equals("plasticWidget")
  {
    PlasticWidgetType widget=order.getWidget().getValue();
    buildPlasticWidget(widget, numOrdered);

    // Add the widget info to bill
    JAXBElement<PlasticWidgetType> widgetElement = of.createPlasticWidget(widget);
    bill.setWidget(widgetElement);

    float amtDue = numOrdered * 0.90;
    bill.setAmountDue(amtDue);
  }
  else
  {
    WidgetType widget=order.getWidget().getValue();
    buildWidget(widget, numOrdered);

    // Add the widget info to bill
    JAXBElement<WidgetType> widgetElement = of.createWidget(widget);
    bill.setWidget(widgetElement);

    float amtDue = numOrdered * 0.30;
    bill.setAmountDue(amtDue);
  }

  return(bill);
}

例 37.17 “Implementation of placeWidgetOrder() 中的代码执行以下操作:

实例化对象工厂以创建元素。

实例化 小部件OrderBillInfo 对象来容纳 bill。

获取排序的小部件数量。

获取以顺序存储的元素的本地名称。

检查该元素是否是 woodWidget 元素。

将元素的值从 的顺序提取到正确的对象类型。

创建一个指向 bill 的 JAXBElement<T > 对象。

设置 bill 对象的 widget 属性。

设置对象的数量 属性

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.