设计稍后将具有GUI的CLI系统

时间:2016-09-05 03:40:29

标签: java user-interface command-line-interface

在当前具有CLI的平台上工作,但稍后将具有GUI。

爪哇。

基本上,目前有一个Platform类可以协调可插入元素的交互。平台是一个单身人士。

有一个CLI类,其中包含可以使用Platform及其插件的命令。

有时命令采用需要进一步用户交互(输入和输出)的平台组件(插件)。我正在考虑创建一个配置了Platform的UI界面,然后组件调用此界面来显示和获取输入。事件驱动的解决方案。

这是一个有效的设计吗?

还有更好的东西吗?

我试图让MVC风格的方法在我脑海中起作用,但问题是它似乎意味着CLI命令(即控制器)中有很多关于平台组件的前瞻性知识。这使得它们紧密耦合,并且我希望尽可能保持命令。这使得扩展程序更容易处理它们,并且为即将到来的GUI开发减少它们。

1 个答案:

答案 0 :(得分:1)

MVC模式对于构建UI非常有用(无论是CLI,GUI,网页,REST API还是完全不同的东西)。出于集成目的,您将要使用其他模式,例如Facade

让我们说你正在建造一台冰淇淋机。你有一个平台界面:

package com.plaform.icecream;

public interface IceCreamMachine {
  public void measureCream(int milliLiters);
  public void measureCondensedMilk(int milliLiters);
  public void measureVanillaExtract(int tableSpoons);
  public void measureCacaoPowder(int tableSpoons);
  public void mixIngredients();
  public void freezeConcoction();
  public Object handOverExperimentResults();
}

然后你有你的MVC模型类:

package com.cli.icecream.model;

public class Icecream {
  private int amount;
  private Flavour flavour;

  // getters, setters, toString, etc.
}

作为枚举的口味:

package com.cli.icecream.model.values;

public enum Flavour {
  VANILLA, CHOCOLATE;
}

控制器:

package com.cli.icecream.controller;

public class IceCreamController {
  private IceCreamFacade serviceFacade;

  public IceCreamController(IceCreamFacade serviceFacade) {
    this.serviceFacade = serviceFacade;
  }

  public void handleShowingFlavours() {
    // ...
  }

  public IceCream handleOrderingIcecream(int balls, Flavour flavour) {
    // validations, etc.

    return serviceFacade.getIceCream(balls, flavour);
  }
}

现在,从MVC隐藏产品背后的实际细节的方法,您可以创建一个将两者集成的Facade:

package com.cli.icecream.integration;

public interface IceCreamFacade {
  public IceCream getIceCream(int balls, Flavour flavour);
}

package com.cli.icecream.integration;

public class IceCreamFacadeImpl {
   private IceCreamMachine iceCreamMachine;

   public IceCreaFacadeImpl(IceCreamMachine iceCreamMachine) {
     this.iceCreamMachine = iceCreamMachine;
   }

   public IceCream getIceCream(int balls, Flavour flavour) {
     int creamMl = ConversionUtil.calculateAmountOfCream(balls);
     int condensedMilkMl = ConversionUtil.calculateAmountOfCondensedMilk(balls);
     int flavourSubstanceTbsp = ConversionUtil.calculateAmountOfFlavourSubstance(balls);

     iceCreamMachine.measureCream(creamMl);
     iceCreamMachine.measureCondensedMilk(condensedMilkMl);

     switch (flavour) {
     case VANILLA:
       iceCreamMachine.measureVanillaExtract(flavourSubstanceTbsp);
       break;
     case CHOCOLATE:
       iceCreamMachine.measureCacaoPowder(flavourSubstanceTbsp);
       break;
     }

     mixIngredients();
     freezeConcoction();

     Object results = iceCreamMachine.handOverExperimentResults();

     return ConversionUtil.convertResultsToIceCream(results);
   }
}

这样,UI(MVC)由幸福地不知道集成平台如何工作的类组成,反之亦然,即解耦。另外一个好处是,如果任一组件改变其行为,那么将两者集成在一起的所有逻辑都集中在一个地方,而不是遍布任何一个应用程序。